Vertrauenswürdige Zeitstempel

Vertrauenswürdige Zeitstempel sind Siegel für die Datenintegrität mit einem vertrauenswürdigen Datum und Uhrzeit zu dem die Zertifizierung stattfand. Klares Ziel ist hier die sichere Verfolgung der Erstellungs- und Änderungszeit eines Dokuments. Niemand – auch nicht der Besitzer des Dokuments – sollte nach Erstellen des Zeitstempels in der Lage sein, das Dokument zu ändern, ohne die Integrität des Zeitstempels zu beeinträchtigen. Ähnlich wie ein Notar erstellt dazu eine unabhängige Instanz – die Trusted Timestamping Agency – einen Zeitstempel für Dateien.
Im folgenden Artikel beschreibe ich, wie mit der kostenfreien Trusted TimeStamping Agency FreeTSA vertrauenswürdige Zeitstempel erzeugt und geprüft werden können. Weder beim Erstellen noch beim Prüfen der Zeitstempel werden dabei die zu stempelnden Dateien an den FreeTSA Server übertragen – sondern nur deren Hashwerte. Die Inhalte bleiben damit vertraulich.

Wie kann ich einen vertrauenswürdigen Zeitstempel erzeugen?

Zunächst einen Timestamp-Request erstellen. Dieser enthält nicht die Daten sondern nur einen Hashwert für die abzustempelnde Datei.

openssl ts -query -data example.file -no_nonce -sha512 -out example.file.tsq

Zum Erstellen des Zeitstempels den erstellte Request anschließend an FreeTSA senden:

curl -H "Content-Type: application/timestamp-query" --data-binary '@example.file.tsq' https://freetsa.org/tsr -o example.file.tsr

Die Antwort enthält den signierten Zeitstempel und wird in diesem Beispiel in example.tsr gespeichert. Der Timestamp-Request example.tsq wird nicht weiter benötigt.

Wie kann ich den Zeitstempel anzeigen?

Zum Anzeigen des Zeitstempels:

openssl ts -reply -in example.file.tsr -text

Dadurch werden folgende Infos (neben anderen) angezeigt:

Serial number: 0x108D72
Time stamp: Jul  7 11:09:18 2019 GMT
TSA: DirName:/O=Free TSA/OU=TSA/description=This certificate digitally signs documents and time stamp requests made using the freetsa.org online services/CN=www.freetsa.org/L=Wuerzburg/C=DE/ST=Bayern

Wie kann ich den Zeitstempel auf Echtheit überprüfen?

Die Echtheit des Zeitstemples kann mit dem Zertifikat von FreeTSA geprüft werden. Dazu müssen folgende Zertifikate von FreeTSA heruntergeladen werden:

tsa.crt signs documents and time stamp requests made using the freetsa.org online services, Key modulus (sha256): 899ba3d9f777e2a74bdd34302bc06cb3f7a46ac1f565ee128f79fd5dab99d68b)

cacert.pem Stammzertifikat, Key modulus (sha256): a4b1a0a81aef68be1cc985d0f83bd6539cfe84174587f900e15ffe3f65433056

openssl ts -verify -in example.file.tsr -data example.file -CAfile cacert.pem -untrusted tsa.crt

Bei gültigem Zeitstempel erscheint:

Verification: OK

Sind die Prüfzertifikate von FreeTSA überhaupt echt?

Um die heruntergeladenen Zertifikate zu überprüfen:

openssl x509 --noout --modulus --in tsa.crt | sha256sum

899ba3d9f777e2a74bdd34302bc06cb3f7a46ac1f565ee128f79fd5dab99d68b

openssl x509 --noout --modulus --in cacert.pem | sha256sum

a4b1a0a81aef68be1cc985d0f83bd6539cfe84174587f900e15ffe3f65433056

Die erwarteten Hashwerte stammen von der FreeTSA Webseite (7. Juli 2019).

Wie kann ich beim Zeitstempeldienst nachfragen?

FreeTSA führt Buch darüber, was unterschrieben worden ist. Im Logbuch kann nachgesehen werden, wann die Daten von TSA gestempelt worden sind. Dazu ist der Hashwert der Datei nötig:

openssl dgst -sha512 example.file | sed -e 's/^.*= //'

Liefert den Hashwert als Ausgabe ähnlich

62bce9167d55f4553289abb4827f7c69890bc85fc0698059deba78ebdd52551d06d0cdc4bb4102d674e320bdefa97be51f6b25088a48c069ff014ae6eb6c7f9e

Im Logbuch lässt sich der unterschriebene Hashwert suchen:

curl -s https://freetsa.org/logs.gz | gunzip -c | grep -i 62bce9167d55f4553289abb4827f7c69890bc85fc0698059deba78ebdd52551d06d0cdc4bb4102d674e320bdefa97be51f6b25088a48c069ff014ae6eb6c7f9e

Hinweis: Zum Zeitpunkt des verfassens dieses Aktikels reicht das Log nur bis zum April 2018. Eine Anfrage beim Betreiber von FreeTSA läuft.

Beispiel: Zeitstempel für Source-Code

Für Quellcode lasse ich nicht jede einzelne Quelldatei stempeln, sondern eine Liste mit Hashwerten der Quelldateien.

Liste mit Hashwerten erstellen:

$ find -type f -exec sha256sum "{}" ";" > file.list

Erzeugen des Zeitstempels für die Liste:

$ openssl ts -query -data file.list -no_nonce -sha512 -out file.list.tsq
$ curl -H "Content-Type: application/timestamp-query" --data-binary '@file.list.tsq' https://freetsa.org/tsr -o file.list.tsr

Anzeigen und Prüfen des Zeitstempels der Liste:

$ openssl ts -reply -in file.list.tsr -text
$ openssl ts -verify -in file.list.tsr -data file.list -CAfile cacert.pem -untrusted tsa.crt

Prüfen der Hashwerte der Quelldateien in der Liste:

$ sha256sum --check file.list