Wenn im Zeitalter der elektronischen Kommunikation vertraglich relevante Informationen in Form von PDF-Dokumenten ausgetauscht werden, muss irgendwie sichergestellt werden, dass die Daten auch wirklich von demjenigen stammen, von dem sie vorgeben, zu sein. Für diesen Zweck gibt es Zertifikate. Sie bestätigen - unabhängig von PDF-Dokumenten - die Echtheit von Personen- oder Unternehmensdaten. Mit einem Zertifikat kann der Inhalt von Dokumenten unterschrieben (signiert) werden. Dafür bietet PDF ein spezielles Signaturfeld an.
PDFUnit stellt zahlreiche Tags für Signaturen und Zertifikate zur Verfügung:
<!-- Tags to test signatures: --> <hasNumberOfSignatures /> <isSigned /> <hasSignature name=".." (required) > <coveringWholeDocument /> (optional) <withNumberOfRevisions /> (optional) <withReason /> (optional) <withRevision /> (optional) <withCertificate /> (optional) <withSigningDate /> (optional) <withSigningName /> (optional) </hasSignature> <hasSignature name=".." (required) > <withCertificate (optional) > <validForCurrentDate /> (optional) <validFor /> (optional) <validFrom /> (optional) <validUntil /> (optional) <havingSubjectField name=".." value=".." /> </withCertificate> </hasSignature> <hasSignatures> <matchingXPath /> (optional) <matchingXML /> (optional) </hasSignatures>
Bei den Tests, die die Eigenschaften eines Zertifikates überprüfen, greift PDFUnit nur auf Daten innerhalb des PDF-Dokumentes zu. Ein Zugriff in's Internet findet nicht statt. Somit wird nicht überprüft, ob ein Zertifikat zurückgezogen wurde.
Ein „signiertes PDF“ darf nicht mit einem „zertifizierten PDF“ verwechselt werden. Ein „zertifiziertes PDF“ garantiert die Einhaltung bestimmter Eigenschaften, die für eine Verarbeitung benötigt werden und in „Profilen“ definiert sind. Tests für zertifizierte PDF-Dokumente sind im Kapitel 3.31: „Zertifiziertes PDF“ beschrieben.
Der einfachste Test ist es, zu prüfen, ob ein Testdokument überhaupt signiert ist:
<testcase name="isSigned"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <isSigned /> </assertThat> </testcase>
Ein PDF-Dokument kann mehrere Signaturen enthalten, wenn es beispielsweise von mehreren Personen unterschrieben wurde. Insofern zielen die nächsten Tests auf die Anzahl und die Namen der Zertifikate:
<testcase name="hasNumberOfSignatures"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasNumberOfSignatures>1</hasNumberOfSignatures> </assertThat> </testcase>
<testcase name="hasSignature"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2" /> </assertThat> </testcase>
Wenn PDF-Dokumente Signaturen nutzen, ist es gelegentlich interessant, festzustellen, ob ein Testdatum innerhalb des Gültigkeitszeitraumes des Zertifikates liegen:
<testcase name="hasSignatureValidForCurrentDate"> <assertThat testDocument="signed/find_document.pdf"> <hasSignature name="Signature2"> <withCertificate> <validForCurrentDate /> </withCertificate> </hasSignature> </assertThat> </testcase>
<testcase name="hasSignatureWithSigningDate_DATE"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <withSigningDate date="2009-07-16" pattern="yyyy-MM-dd" /> </hasSignature> </assertThat> </testcase>
Eine weitere Testmöglichkeit ist die, sicherzustellen, dass das Zertifikat innerhalb eines Zeitraumes gültig ist:
<testcase name="hasSignature_FirstAndLastDate"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <withCertificate> <validFrom date="20060822" pattern="yyyyMMdd" /> <validUntil date="20090904" pattern="yyyyMMdd" /> </withCertificate> </hasSignature> </assertThat> </testcase>
Manche Informationen einer Signatur können mit speziellen Tags getestet werden:
<testcase name="hasSignature_CoveringWholeDocument"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <coveringWholeDocument /> </hasSignature> </assertThat> </testcase>
<testcase name="hasSignature_WithSigningName"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <withSigningName name="John B Harris"/> </hasSignature> </assertThat> </testcase>
<testcase name="hasSignature_WithRevision"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <withRevision nr="1" /> </hasSignature> </assertThat> </testcase>
<testcase name="hasSignature_WithNumberOfRevisions"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <withNumberOfRevisions nr="1" /> </hasSignature> </assertThat> </testcase>
<testcase name="hasSignature_WithReason"> <assertThat testDocument="signed/sampleSignedPDFDocument.pdf"> <hasSignature name="Signature2"> <withReason>I am the author of this document</withReason> </hasSignature> </assertThat> </testcase>
Der Rest der Informationen ist über Tests auf Basis von XML und XPath erreichbar.
Jede Information einer Signatur kann mit XPath-Ausdrücken übergeprüft werden.
Um den XPath-Ausdruck überhaupt entwickeln zu können, müssen Sie die Signaturdaten
mit dem Hilfsprogramm ExtractSignaturesInfo
in eine XML-Datei überführen.
Die Datei hat dieses Aussehen (Ausschnitt):
|
Das dazugehörende Bild vom Adobe Reader® zeigt die gleichen Informationen:
|
Die Signaturinformationen eines PDF-Dokumentes können vollständig mit der XML-Datei verglichen werden:
<testcase name="hasSignatures_MatchingXML"> <assertThat testDocument="signed/helloWorld_sign.pdf"> <hasSignatures> <matchingXML file="signed/helloWorld_sign.xml" /> </hasSignatures> </assertThat> </testcase>
Wenn nur Teile der XML-Datei testrelvant sind, muss für das Testziel
ein passender XPath-Ausdruck gefunden werden. Im folgenden Beispiel wird
überprüft, ob das erste Zertifikat ein OU
-Tag mit einem bestimmten
Wert hat:
<testcase name="hasSignatures_MatchingXPath_OneOfManyOU"> <assertThat testDocument="signed/helloWorld_sign.pdf"> <hasSignatures> <matchingXPath expr="//certificate[1]/subject[OU='Digital ID Class 1 - Netscape']" /> </hasSignatures> </assertThat> </testcase>
Hinweis: Zum Erarbeiten und Überprüfen eines XPath-Ausdrucks gibt es in Eclipse die „XPath-View“.
Mehrere Tests einer Signatur können kombiniert werden:
<testcase name="differentAspectsAroundSignature"> <assertThat testDocument="signed/helloWorld_sign.pdf"> <isSigned /> <hasSignature name="sign_rbl" > <withSigningName name="Raymond Berthou" /> <withSigningDate date="2007-10-14T09:09:12+0200" pattern="yyyy-MM-dd'T'HH:mm:ssZ" /> <withRevision nr="1" /> <withCertificate> <havingSubjectField name="O" value="VeriSign, Inc." /> </withCertificate> </hasSignature> </assertThat> </testcase>
Überlegen Sie sich aber einen guten Namen für diesen Test!