3.21. Signaturen und Zertifikate

Überblick

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.

Existenz

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>

Signaturnamen und -anzahl

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>

Gültigkeitsdatum

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" /> 1
    </hasSignature>
  </assertThat>
</testcase>

1

Das Attribut pattern bestimmt, dass der Vergleich auf der Basis von Jahr-Monat-Tag stattfindet.

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>

Revision, Grund (Reason), Unterzeichner (Sign Name)

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.

Vergleiche auf Basis von XML und XPath

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.

Zusammenhängend testen

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!