Teknik Makale

eIDAS Güven Listeleri ve Nitelikli PDF İmzaları

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

Delphi'de bir Avrupa güven listesi için ayrıştırmadan önce kimliklendirme akışı: taze getirilmiş ya da önbellek anlık görüntüsünden gelen ham XML, TPdfEuropeanTrustedList hiçbir şeyi ayrıştırmadan önce IPdfTrustedListAuthenticator arayüzünden geçer
Taze ve önbelleklenmiş listeler aynı kimliklendiriciyle karşılaşır ve anlık görüntü yalnızca o geçtikten sonra var olur

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

PDFium güven listesi bileşeninin uyguladığı güncelleme değişmezleri: değişmeyen bölge, kesin biçimde artan sıra numarası ve asla geriye gitmeyen verme zamanı; üçü birlikte sürüm düşürme saldırılarını engeller
Üç tek yönlü denetim, gerçek bir güncellemeyi yeniden oynanmış ya da değiştirilmiş bir listeden ayırır

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

Delphi'de PAdES nitelikli güven değerlendirmesi: IPdfQualifiedTrustEvaluator hizmet sertifikalarını kesin DER karşılaştırmasıyla eşler, QualifiedTrustStatus ile QualifiedTrust alanlarını doldurur ve CertificateTrustStatus dokunulmaz kalır
Zincir güveni ile eIDAS nitelikli durumu yan yana kaydedilir; böylece iki bulgu da görünür kalı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