Bir PDF imzasının eIDAS kapsamında nitelikli olduğuna karar vermek, kriptografiyle hiçbir ilgisi olmayan bir soruyu yanıtlamak demektir: sertifika, imzanın yapıldığı anda bir üye devletin nitelikli olarak listelediği bir güven hizmeti tarafından verildi mi. Cevap, bölge başına yayımlanan bir XML belgesi olan bir güven listesinde yaşar ve o belgenin bütün değeri özgünlüğüne bağlıdır. Bu yüzden PDFium bileşeni, biri onu onaylamadan içine bakmayı reddeder. TPdfEuropeanTrustedList.ParseAuthenticated, tek bir hizmeti ayrıştırmadan önce ham baytların tamamını çağıranın sağladığı bir IPdfTrustedListAuthenticator arayüzüne verir ve ancak o kimliklendirici açıkça geçerse bir anlık görüntü oluşturur
O sıralama tasarımın kendisidir. Bu özellikteki her şey, rahatsız edici görünen bölümler dahil, ondan doğar
Ayrıştırılmış olmak güvenilir olmak değildir
Temiz ayrışan bir güven listesi size XML'in iyi biçimli olduğunu söyler. Onu kimin yazdığı hakkında hiçbir şey söylemez. Liste, bütün nitelikli durum kararınızın dayandığı şey olduğundan, ayrıştığı için bir listeyi kabul etmek kararı anlamsızlaştırır: listeyi değiştirebilen bir saldırgan kendi sertifika otoritesini nitelikli ilan edebilir
Aynı akıl önbelleklemeye de uygulanır ve adlandırmaya değer tuzak budur. Anlık görüntü önbelleği özgün XML'i bir SHA-256 özetiyle birlikte saklar ve yükleme sırasında örtüşen bir özeti listenin gerçek olduğunun kanıtı saymak kolay olurdu. Değildir. Dosyayı saklayan aynı işlemce, hiçbir anahtar devrede olmadan hesaplanan bir özet yalnızca baytların siz yazdıklarınızdan beri değişmediğini doğrular; liste önbelleklendiğinde sahteyse özet, aynı sahte liste olduğunu teyit eder. Bu yüzden önbelleklenmiş bir anlık görüntüyü yüklemek, tazesini ayrıştırmakla aynı kimliklendiriciden geçer. Bütünlük ile özgünlük farklı özelliklerdir ve yalnızca biri anahtar ister
uses
FPdfTrustedList;
type
TListAuthenticator = class(TInterfacedObject, IPdfTrustedListAuthenticator)
public
function Authenticate(const XmlData: TBytes;
out AuthenticationDetails: string): Boolean;
end;
function TListAuthenticator.Authenticate(const XmlData: TBytes;
out AuthenticationDetails: string): Boolean;
begin
// Politikanız burada yaşar: XMLDSIG zarflı imzasını, bant dışında
// sabitlediğiniz liste imzalama sertifikasına karşı doğrulayın ve
// denetim izi için neyi denetlediğinizi anlatın
Result := VerifyEnvelopedXmlSignature(XmlData, FPinnedListSigner);
if Result then
AuthenticationDetails := 'XMLDSIG verified against pinned LOTL signer';
end;
var
List: TPdfEuropeanTrustedList;
Cache: TFileStream;
begin
List := TPdfEuropeanTrustedList.ParseAuthenticated(RawXml,
TListAuthenticator.Create, TPdfTrustedListOptions.Default);
// Anlık görüntü yalnızca kimliklendirici evet dediği için var
Cache := TFileStream.Create('tl-de.snapshot', fmCreate);
try
List.SaveCache(Cache);
finally
Cache.Free;
end;
end;
Doğrulayıcı ağ politikasına sahip değildir
Bir PAdES doğrulayıcının güven listeleri listesine nasıl ulaşılacağına, vekil sunucudan geçilip geçilmeyeceğine, ne sıklıkla yeniden deneneceğine ya da bir bölge erişilemezse ne yapılacağına karar vermeye hakkı yoktur. Onlar uygulama ve dağıtım kararlarıdır ve düzenlenmiş ortamlarda sık sık denetlenirler. Bu yüzden güncellemeler IPdfTrustedListSource üzerinden gelir; ona bir URI ile bir bayt sınırı verilir ve bayt döndürür
Bileşenin uyguladığı şey, bir güncellemeyi güncelleme kılan, ikame olmamasını sağlayan değişmezlerdir. Update, bölgenin değişmediğini, sıra numarasının kesin biçimde arttığını ve verme zamanının geriye gitmediğini gerektirir. O üç denetim en bariz sürüm düşürme saldırılarını engeller: aradan çekilmiş bir hizmeti hâlâ listeleyen eski bir listeyi yeniden oynatmak ya da hizmetlerine asla güvenmek istemediğiniz başka bir bölgenin listesini takmak
Ayrıştırıcı sınırları ve hiç DTD yok
TPdfTrustedListOptions, XML boyutunu, simge sayısını, iç içe geçme derinliğini, hizmet sayısını, sertifika sayısını ve tek bir sertifikanın boyutunu sınırlar; kullanılabilir değerleri bir Default sınıf işlevi sağlar. Güven listeleri öngörülebilir boyutta yayımlanmış belgelerdir; dolayısıyla sınırları koymak ucuzdur ve onları aşması gereken meşru bir liste yoktur
Ayrı olarak ve koşulsuz biçimde ayrıştırıcı, DTD ile varlık bildirimlerini reddeder. Bu, varlık genişletmeli hizmet reddini ve dış varlık ifşa yolunu tek bir ret ile kapatır ve bedava olur, çünkü güven listeleri varlık kullanmaz. Güvenilmeyen girdiden erişilebilen her XML ayrıştırıcısı bu şekilde yapılandırılmalıdır; buradaki fark, retkinin yapılandırılabilir olmaması ve iyi niyetli bir seçenek değişikliğiyle kapatılamamasıdır
Nitelikli durum zincir güveninin yanına kaydedilir, onunla birleştirilmez
Değerlendirme tarafı bilinçli olarak ayrıdır. TPadesTrustValidationOptions.QualifiedTrustEvaluator, güven listesi anlık görüntüsünün uyguladığı bir IPdfQualifiedTrustEvaluator alır. Doğrulama sırasında değerlendirici yaprak sertifikayı, zinciri ve bir doğrulama zamanı alır; hizmet sertifikalarını imzalayıcıyla ve zincirle kesin DER karşılaştırmasıyla eşler; hizmet durumunu, hizmet türü tanımlayıcısını ve niteleyici URI'lerini o andaki zaman noktasında birleştirir ve bir değerlendirme kaydı döndürür
Sonuç her imzada iki yere düşer: kaba bir durum olarak QualifiedTrustStatus ve bölge, sağlayıcı adı, hizmet adı, tür tanımlayıcısı, durum ve durum başlama zamanıyla eksiksiz değerlendirme olarak QualifiedTrust. Yapmadığı şey CertificateTrustStatus durumunu değiştirmektir. Sistem zincir güveni ile nitelikli durum farklı soruları yanıtlar ve ikisini çökerten bir rapor, "güvenilir ama nitelikli değil" ile "nitelikli ama zincir doğrulanmıyor" durumlarını ayırt edemez; ikisi de gerçektir ve ikisi de farklı ele almaya muhtaçtır
var
Options: TPadesTrustValidationOptions;
Report: TPadesValidationResult;
I: Integer;
begin
Options := TPadesTrustValidationOptions.Default;
Options.CheckRevocation := True;
Options.QualifiedTrustEvaluator := List; // kimliklendirilmiş anlık görüntü
Options.QualifiedValidationTime := SigningTime; // Now değil
Report := Pdf.ValidatePadesTrust(Options);
for I := 0 to High(Report.Signatures) do
if Report.Signatures[I].QualifiedTrustStatus = pcsValid then
Writeln(Format('signature %d qualified by %s / %s (%s)',
[I, Report.Signatures[I].QualifiedTrust.Territory,
Report.Signatures[I].QualifiedTrust.ProviderName,
Report.Signatures[I].QualifiedTrust.ServiceName]))
else if Report.Signatures[I].QualifiedTrustStatus = pcsIndeterminate then
// Eşleşen hizmet yok ya da anlık görüntü bu zaman için cevap veremiyor
Writeln(Format('signature %d: qualified status undetermined', [I]));
end;
Doğrulama zamanı neden şu an değildir
Çünkü niteliklilik bir anın özelliğidir. Bir güven hizmetine nitelikli durum verilebilir, sonra geri alınabilir ve daha sonra yeniden verilebilir ve o geçişlerin her biri listede bir başlama zamanı taşır. Hizmet nitelikliyken yapılan bir imza sonrasında nitelikli kalır; vermeden önce yapılan imza geriye dönük nitelikli olmaz. Geçerli zamana karşı değerlendirmek bu nedenle iki yönde de yanlış cevap verir
Liste bunun için gerekeni taşır: her hizmet kaydının bir durum başlama zamanı ve tarihsel girdileri güncel olanlardan ayıran bir bayrağı vardır ve değerlendirici onları sizin vereceğiniz zamana karşı birleştirir. Pratikte o zaman, CMS'de iddia edilen imzalama zamanından değil imzadaki güvenilir bir zaman damgasından gelir; politika araması gibi görünen bir soru için bile uzun süreli doğrulama malzemesinin neden önemli olduğunun nedeni budur. Zaman damgası ve DSS tarafı uzun süreli imza makalesinde kapsanır
Hâlâ kurmanız gerekenler
Üç şey ve hiçbiri bir PDF kitaplığına ait değildir. Kimliklendirici; yani güvendiğiniz bir kanaldan edindiğiniz bir liste imzalama sertifikasına karşı gerçek XMLDSIG doğrulaması. Getirme politikası; yani neyi ve ne sıklıkla tazelediğiniz ve bir tazeleme başarısız olduğunda uygulamanızın ne yaptığı. Ve bölgesel kapsam; yani hiç liste taşıyorsanız hangilerini taşıdığınız; o da karşı taraflarınızın hangi üye devletlerde imza attığına dair bir iş kararıdır
Bileşenden aldığınız şey incelikli biçimde yanlış yapması kolay olan bölümdür: ayrıştırmadan önce kimliklendirme sıralaması, sınırlı ve varlıksız XML ayrıştırma, tek yönlü güncelleme değişmezleri, kesin DER hizmet eşlemesi, tarihsel durum değerlendirmesi ve sıradan zincir güveninden ayrı kalan bir sonuç. Sorununuz daha temelse —bir doğrulayıcı, doğru olduğuna inandığınız bir imzayı reddediyorsa— alışılmış nedenler doğrulayıcıların PAdES imzalarını neden reddettiğinde kataloglanır ve imza inceleme yüzeyi imzaların ve PAdES düzeylerinin incelenmesinde betimlenir. Bileşen yetenekleri PDFium Delphi component ürün sayfasında listelenir