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