TPDFlibEUTSLTrustSource

Sicherheit und Signaturen

Beschreibung

Lädt eine EU-Liste vertrauenswürdiger Listen und ihre referenzierten nationalen vertrauenswürdigen Dienstlisten, verifiziert ihre XML-Signaturen und liefert zeitbewusste Vertrauensanker an TPDFlibSignatureVerifier

Die Quelle wertet auch Aussagen qualifizierter Zertifikate, Vertrauensdienst-Qualifier, Qualifikationskriterien, Dienstbereichserweiterungen und den Dienstverlauf aus, um qualifizierte elektronische Signaturen und Siegel nach eIDAS einzustufen

Einheit

PDFlibEUTSL

Vertrauensbootstrap

Function AddLOTLSigningCertificateDER(
  Const CertificateDER: AnsiString): Boolean;
Function AddLOTLSigningCertificateFromFile(
  Const CertificateFile: WideString): Boolean;
Procedure ClearLOTLSigningCertificates;
Procedure Clear;

Eine Anwendung muss mindestens ein unabhängig vertrauenswürdiges LOTL-Signaturzertifikat fixieren, bevor sie eine LOTL lädt

Clear verwirft die geladene LOTL und jeden nationalen TSL-Snapshot samt deren Zeigern, Diensten und Diagnosezustand, ohne die fixierten LOTL-Signaturzertifikate anzutasten; die Instanz ist danach bereit, einen frischen Snapshot zu laden Das in XML

Das in XML-KeyInfo eingebettete Signaturzertifikat muss byte für byte mit einem gepinnten Zertifikat übereinstimmen, damit ein sich selbst erklärender Signierer kein eigenes Vertrauen etablieren kann

Jede nationale TSL muss wiederum von einem Zertifikat signiert sein, das im entsprechenden, bereits verifizierten LOTL-Zeiger enthalten ist

Laden vertrauenswürdiger Listen

Function LoadLOTLFromString(Const XMLData: AnsiString): Boolean;
Function LoadLOTLFromFile(Const FileName: WideString): Boolean;
Function LoadLOTLFromURL(Const URL: WideString): Boolean;
Function LoadTSLFromString(PointerIndex: Integer;
  Const XMLData: AnsiString): Boolean;
Function LoadTSLFromFile(PointerIndex: Integer;
  Const FileName: WideString): Boolean;
Function LoadTSLFromURL(PointerIndex: Integer): Boolean;
Function RefreshAllTSLs: Integer;

Das XML-Laden deaktiviert DTDs und externe Entitäten, wendet eine konfigurierbare Größenbegrenzung an, verlangt eine umhüllende Signatur über den Dokumentstamm und weist getrennte Referenzen, doppelte Signaturen, Digest-Fehlschläge, Nichtübereinstimmungen von Signierer und Territorium zurück

LoadLOTLFromURL und LoadTSLFromURL verlangen standardmäßig HTTPS und wenden NetworkTimeoutMS und MaxXMLBytes auf jede Anfrage an; die Eigenschaft RequireHTTPS (Standard True) steuert die Schemaprüfung, und das Abschalten ist nur für kontrollierte Testumgebungen gedacht

RefreshAllTSLs

NextUpdate lädt jeden aktuellen Zeiger herunter und validiert ihn, bevor der aktive Dienstesatz ersetzt wird, sodass ein teilweiser Netzwerk- oder Signaturfehler den vorherigen verifizierten Snapshot bewahrt Abgelaufene LOTL- und TSL-Snapshots scheitern standardmäßig im gesperrten Zustand und bleiben nach ihrer AllowExpiredLists-Zeit unbrauchbar;

Inspektion

Function GetPointerCount: Integer;
Function GetPointerInfo(Index: Integer;
  Out Info: TPDFlibEUTSLPointerInfo): Boolean;
Function GetPointerSigningCertificateDER(PointerIndex,
  CertificateIndex: Integer; Out CertificateDER: AnsiString): Boolean;
Function GetServiceCount: Integer;
Function GetServiceInfo(Index: Integer;
  Out Info: TPDFlibEUTSLServiceInfo): Boolean;
Function GetServiceCertificateDER(ServiceIndex, CertificateIndex: Integer;
  VerificationTime: TDateTime;
  Out CertificateDER: AnsiString): Boolean;

Die Zeigerinformationen legen Territorium, Standort, MIME-Typ und die zulässige Anzahl TSL-Signierer offen

Die Dienstinformationen legen den aktuellen Dienstnamen, Typ, Status, Statusbeginn, Zertifikatsanzahl und Verlaufsanzahl offen

GetLOTLLocation, GetLOTLNextUpdate, GetRevision und GetLastError legen Snapshot- und Diagnosezustand offen

Signaturprüfung

var
  TrustSource: TPDFlibEUTSLTrustSource;
  ChainReport: TPDFlibSignatureChainReport;
begin
  TrustSource:= TPDFlibEUTSLTrustSource.Create;
  try
    TrustSource.AddLOTLSigningCertificateFromFile('EU-LOTL-Signer.cer');
    if not TrustSource.LoadLOTLFromURL(LOTLURL) then
      raise Exception.Create(String(TrustSource.GetLastError));
    if TrustSource.RefreshAllTSLs<> TrustSource.GetPointerCount then
      raise Exception.Create(String(TrustSource.GetLastError));

    Verifier.SetTrustSource(TrustSource);
    try
      Result:= Verifier.VerifySignerCertificateChainEx(
        0, 0, srmOnline, 0, ChainReport);
    finally
      Verifier.SetTrustSource(nil);
    end;
  finally
    TrustSource.Free;
  end;
end;

SetTrustSource

GetTrustAnchors(VerificationTime, Certificates) und EvaluateCertificateChain(Certificates, VerificationTime, Report) sind die beiden Hooks, die der Prüfer an der Quelle aufruft: der erste liefert die DER-codierten Anker der zur angeforderten Zeit vertrauenswürdigen Dienste, der zweite stuft eine validierte Kette in einen TPDFlibSignatureQualificationReport ein, wobei der zum Zeitpunkt geltende Dienstesatz genutzt wird; Anwendungen rufen sie normalerweise indirekt über den Prüfer auf statt direkt

Der Prüfer kombiniert Quellanker mit allen manuellen benutzerdefinierten Ankern in einer exklusiven Kettenengine und speichert diese Engine nach Quellrevision und Verifizierungszeit zwischen

Wenn eine Quelle zugewiesen ist und weder sie noch der manuelle Satz einen Anker liefert, scheitert die Verifikation fail-closed, statt auf Windows-Systemwurzeln zurückzufallen

Qualifizierungsbericht

TPDFlibSignatureChainReport.QualificationReport liefert nach der Auswertung einer gültigen Kette einen TPDFlibSignatureQualificationReport

Der Bericht identifiziert das Dienstterritorium, Name, Typ, Status, Statusbeginn, angewandte Qualifier, Zertifikatszweck, Qualifikationsstatus und den Status des qualifizierten Signaturerstellungsgeräts

Statuswerte unterscheiden nicht bewertet, nicht anwendbar, nicht qualifiziert, qualifiziertes Zertifikat, qualifizierte elektronische Signatur und qualifiziertes elektronisches Siegel, mit getrennten QSCD-Varianten

Siehe auch

TPDFlibSignatureVerifier