PDF Signatur Validierung

PDF Signatur Validierung

Experimentelle API

Die hier beschriebene Funktionalität ist als experimentelle API deklariert. Damit gelten für diese Klasse die Bedingungen der Experimental jadice API , die in der Dokumentation der document platform dokumentiert sind.

Einleitung

Die grundlegende Verwendung sowie Informationen zu Signaturen wurden bereits im Artikel PDF Signatur Informationen erklärt. In diesem Artikel geht es darum, wie die Echtheit und Gültigkeit einer solchen Signatur validiert werden kann. Grundsätzlich wird zwischen 3 Arten von elektronischen Signaturen unterschieden:

  • Einfache elektronische Signaturen – SES

  • Fortgeschrittene elektronische Signaturen – AES

  • Qualifizierte elektronische Signaturen – QES

Eine einfache elektronische Signatur (SES) bietet eine rechtsgültige Möglichkeit, Dokumente elektronisch zu unterzeichnen, insbesondere bei Dokumenten, bei denen das Gesetz keine spezifische Form vorschreibt. Eine einfache elektronische Signatur kann beispielsweise eine in ein Dokument einfügte eingescannte handschriftliche Unterschrift sein. Diese Art der Signatur ist jedoch nicht sicher und bietet keine Möglichkeit, die Echtheit der Unterschrift oder die Integrität des Dokuments zu validieren. Fortgeschrittene und qualifizierte Signaturen hingegen basieren auf einem Zertifikat, welches bei der Validierung geprüft wird. Ebenso erfolgt hier eine Prüfung, ob das Dokument seit der Signierung verändert wurde. Um die Validierung, der in fortgeschrittenen und qualifizierten Signaturen enthaltenen Zertifikate, erfolgreich durchführen zu können, ist ein TrustStore erforderlich.

 

Zur Validierung von Signaturen können Integratoren das jadice Modul signature-dss nutzen. Es basiert auf einer Open-Source-Software Lösung eSig DSS (eSignature Digital Signature Service, https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/Digital+Signature+Service+-++DSS). Es handelt sich dabei um ein offizielles Framework, das von der EU-Kommission und ETSI (European Telecommunications Standards Institute) entwickelt wurde, um digitale Signaturen interoperabel, sicher und gesetzeskonform umzusetzen

 

Was ist ein TrustStore

Ein TrustStore ist ein Speicher (meist in Datei-Form), der vertrauenswürdige Zertifikate enthält – insbesondere Root-Zertifikate von vertrauenswürdigen Zertifizierungsstellen (Certificate Authorities, CAs). Eine offizielle Liste der EU mit zu Ländern gehörigen Listen an Vertrauensdienstanbieter und deren Zertifikaten wird unter https://ec.europa.eu/tools/lotl/eu-lotl.xml zur Verfügung gestellt. Einzelne Listen können auch unter https://eidas.ec.europa.eu/efda/trust-services/browse/eidas/tls entnommen werden. Für gewöhnlich enthalten elektronische Signaturen ein End-Zertifikat und verweisen über eine Zertifikatskette auf ein vertrauenswürdiges Root-Zertifikat.  Bei der Prüfung von elektronischen Signaturen wird nun geprüft, ob die Zertifikatskette valide ist, sowie ob das Root-Zertifikat der Kette im TrustStore als vertrauenswürdiges Zertifikat hinterlegt ist. 

 

Erstellung eines eigenen TrustStore

Wie zuvor erwähnt kann die Liste an vertrauenswürdigen Zertifikaten je nach Integration & Verwendung angepasst sein. Um die Erstellung eines passenden TrustStores zu vereinfachen, haben wir ein öffentliches Repository jadice-dss-utils erstellt. Hiermit lässt sich ein TrustStore basierend auf konfigurierbaren vertrauenswürdigen Listen erstellen.

Das folgende Codebeispiel zeigt die Erstellung eines TrustStore, der lediglich die vertrauenswürdigen Zertifikate der offiziellen deutschen Liste enthält

TrustStoreCreator:

List<String> trustedLists = List.of("https://tl.bundesnetzagentur.de/TL-DE.XML"); File targetTrustStoreFile = new File("path/to/trustStore.p12"); TrustStoreCreator.create(targetTrustStoreFile, "password-of-the-truststore", "PKCS12", trustedLists);

 

Weitere anwendungsspezifische Zertifikate können einem TrustStore dann bspw. mithilfe des keytool  über die Kommandozeile hinzugefügt werden

Keytool:

keytool -import -alias alias-of-the-certificate -keystore trustStore.p12 -file certificate-to-add.pem -storetype PKCS12 -storepass password-of-the-truststore

In diesem Beispiel wird in einen bestehenden TrustStore trustStore.p12 vom Type PKCS12, ein Zertifikat certificate-to-add.pem unter dem alias alias-of-the-certificate hinzugefügt. Damit das Zertifikat hinzugefügt werden kann muss ebenfalls das Passwort password-of-the-truststore des TrustStores angegeben werden.

Validierung

Um eine Validierung durchzuführen, werden zwei Objekte benötigt. Der Datenstrom, welcher die elektronische Signatur enthält, sowie gesammelte Informationen zum TrustStore gegen welchen die Zertifikate validiert werden soll. Für die Beschaffung der Objekte kann die Klasse SignatureHelper verwendet werden. Unter anderem hilft die Klasse dabei, den möglicherweise längeren Erstellungsprozess des TrustStores asynchron zu starten und diesen zu laden.

Die Validierung der Daten kann mittels API getätigt werden und könnte bspw. folgendermaßen aussehen

SignatureValidations:

SeekableInputStream inputStream = SignatureHelper.INSTANCE.getDataInputStream(pageSegment); TrustStoreParameter parameter = SignatureHelper.INSTANCE.getTrustStoreParameter(); SignatureValidationResult result = SignatureValidations.validateSignature(inputStream, parameter);

In diesem Beispiel wird zuerst der Datenstrom des Default-PageSegments extrahiert. Anschließend werden die zur Validierung benötigten TrustStoreParameter erstellt. Beide Variablen können dann anschließend verwendet werden um eine Validierung durchzuführen. Das Resultat gibt Auskunft darüber, ob die Validierung erfolgreich war.

Damit die Validierung erfolgreich durchgeführt werden kann, muss sich mindestens ein Validator-Modul (bspw. signature-dss) auf dem Klassenpfad befinden.

 

Demo-GUI

Damit die Validierung für entsprechende Dokumente automatisiert gestartet wird, sowie der Nutzer eine visuelle Rückmeldung zur Validierung, als auch dem Ergebnis bekommt, haben wir einige Demo-Klassen im Swing-Viewer. Die Klasse, welche das eigentliche Validieren übernimmt, ist hierbei RolloutPDFSignatureBox.