Zeitstempel nach RFC 3161 · technischer Leitfaden

Was ein RFC-3161-Zeitstempel ist und wie man ihn prüft

Eine Zeitstempelstelle (TSA) signiert den Fingerabdruck einer Datei zusammen mit Datum und Uhrzeit. Hier steht, was diese Antwort enthält, wie du sie mit OpenSSL oder im Browser prüfst und wie du sie per API anforderst.

Du möchtest einen Unix-Timestamp in ein Datum umrechnen? Das ist etwas anderes: Hier bekommt eine Datei ein Datum.

Eine .tsr prüfen

Öffnet den Validator: Du fügst die Datei und ihren Zeitstempel hinzu, und der Fingerabdruck wird in deinem Browser berechnet.

Aus deinem eigenen System ausstellen: die API →
Nur der Fingerabdruck reist Die Anfrage enthält einen SHA-256: Die Stelle sieht die Datei nie.
Offener Standard RFC 3161, das IETF-Protokoll, das Zeitstempelstellen seit 2001 verwenden.
Ohne Dritte prüfbar Mit OpenSSL oder einem beliebigen Validator, ohne sich auf den Aussteller zu verlassen.

Was es ist

Eine Anfrage, eine Stelle und ein Token.

RFC 3161 ist der Standard für Zeitstempel, und was er tut, ist einfacher, als es klingt.

Die Anfrage enthält den Fingerabdruck

Der Client berechnet den SHA-256 der Datei und sendet der Stelle nur diesen Fingerabdruck, mit einer Zufallszahl (Nonce), um die Antwort wiederzuerkennen. Die Datei reist nicht.

Die TSA signiert die Uhrzeit

Die Zeitstempelstelle verbindet diesen Fingerabdruck mit Datum und Uhrzeit ihrer Uhr und signiert das mit einem Zertifikat, das nur für Zeitstempel zugelassen ist.

Die Antwort ist das Token

Sie gibt eine .tsr zurück: den Status der Anfrage und, wenn erteilt, das signierte Token. Mit der Datei und dem Token kann es jeder später prüfen.

In der .tsr

Was in einer .tsr steckt.

Eine .tsr ist eine ASN.1-Struktur in DER-Kodierung. Das sind die Felder, auf die es ankommt, mit den Namen, die der Standard ihnen gibt.

status
Der Status der Anfrage: erteilt oder abgelehnt, unter anderem. Er steht vor dem Token, und an ihm scheitern Validatoren, die nur eine .tst erwarten.
messageImprint
Der Algorithmus (SHA-256) und der Fingerabdruck der Datei. Das ist der Wert, der mit deiner Datei verglichen wird.
genTime
Datum und Uhrzeit, die die Stelle signiert, in UTC. Das ist die Zeit des Zeitstempels.
serialNumber
Die Nummer, die die Stelle diesem Token zuweist, eindeutig unter allen, die sie ausstellt.
policy
Die Kennung (OID) der Zeitstempel-Richtlinie, unter der es ausgestellt wurde.
nonce
Die Zufallszahl der Anfrage, unverändert zurückgegeben: Sie zeigt, dass diese Antwort zu dieser Anfrage gehört.
SignedData
Die CMS-Hülle: die Signatur der Stelle über alles oben Genannte und, wenn die Anfrage es verlangt hat, ihr Zertifikat. Sellat verlangt es immer.

Eine .tst ist nur das Token, ohne den Status. Beide tragen denselben Nachweis: Es ändert sich die Hülle, nicht das, was er beweist.

Qualifiziert oder nicht

Qualifizierter und nicht qualifizierter Zeitstempel: dasselbe Token, zwei rechtliche Stufen.

Technisch ist ein RFC-3161-Token gleich, wer es auch ausstellt: Fingerabdruck, Uhrzeit und Signatur werden auf dieselbe Weise geprüft. Was sich ändert, ist, wer es signiert.

Die Verordnung (EU) 910/2014 (eIDAS) nennt einen Zeitstempel qualifiziert, wenn er ihren Artikel 42 erfüllt: Er verknüpft Datum und Uhrzeit so mit den Daten, dass eine unbemerkte Veränderung der Daten nach vernünftigem Ermessen ausgeschlossen ist, er beruht auf einer korrekten Zeitquelle, die mit der koordinierten Weltzeit verknüpft ist, und er wird von einem qualifizierten Vertrauensdiensteanbieter signiert oder gesiegelt, der als solcher auf der Vertrauensliste eines Mitgliedstaats steht.

Keinem elektronischen Zeitstempel darf die Rechtswirkung oder die Zulässigkeit als Beweismittel allein deshalb abgesprochen werden, weil er elektronisch oder nicht qualifiziert ist (Art. 41 Abs. 1). Für einen qualifizierten gilt zusätzlich die Vermutung der Richtigkeit von Datum und Uhrzeit und der Integrität der Daten (Art. 41 Abs. 2).

Wie du einen qualifizierten Zeitstempel erhältst →

Mit OpenSSL prüfen

Drei Befehle, auf deinem eigenen Computer.

Du brauchst die Datei, die .tsr und das Zertifikat der Stelle, die sie signiert hat (in einem Sellat-Paket: autoridad-sellado.pem). Nichts verlässt deinen Rechner.

  1. 01

    Lesen, was der Zeitstempel sagt

    openssl ts -reply -in zeitstempel.tsr -text

    Zeigt den Status und den Inhalt des Tokens: die Richtlinie, den Fingerabdruck („Message data“), die Seriennummer, die Uhrzeit und die Nonce.

  2. 02

    Den Fingerabdruck der Datei berechnen

    openssl dgst -sha256 datei

    Er muss mit dem „Message data“ aus dem vorigen Schritt übereinstimmen, das OpenSSL in Hexadezimalblöcken ausgibt. Ändert sich ein einziges Byte der Datei, stimmt er nicht mehr.

  3. 03

    Signatur und Fingerabdruck zusammen prüfen

    openssl ts -verify -in zeitstempel.tsr -data datei -CAfile autoridad-sellado.pem -partial_chain

    Wenn alles stimmt, antwortet es „Verification: OK“.

Das Zertifikat der Stelle ist ein Blatt, keine CA: Ohne -partial_chain sucht OpenSSL seinen Aussteller und scheitert. Das ist der häufigste Grund, warum ein Validator einen korrekten Zeitstempel ablehnt. Hast du eine .tst, ergänze die Befehle um -token_in.

Im Browser prüfen

Der Zeitstempel-Validator akzeptiert die .tsr oder die .tst zusammen mit der Datei. Der Fingerabdruck wird auf deinem Gerät berechnet, und nur Fingerabdruck und Zeitstempel werden gesendet. Er sagt dir getrennt, ob Struktur, Fingerabdruck, Signatur, Signaturzertifikat und EU-Vertrauensliste stimmen.

Eine .tsr prüfen

Per API

Wie du ihn per API über Sellat erhältst.

Sellat ist keine Zeitstempelstelle: Das RFC-3161-Token, das du über Sellat erhältst, ist der von der FNMT-RCM ausgestellte qualifizierte Zeitstempel. Sellat beantragt ihn über den Fingerabdruck, den du sendest, prüft ihn gegen die EU-Vertrauensliste und bewahrt ihn in deinem Nachweis auf.

  1. 01

    Den Fingerabdruck berechnen

    Den SHA-256 der Datei, in deinem eigenen System. Er ist das Einzige, was gesendet wird.

  2. 02

    Den Nachweis mit Zeitstempel erstellen

    POST /api/v2/proofs mit "qualified": true, oder POST /api/v2/proofs/{id}/qualified für einen bestehenden Nachweis. Mit einem Idempotency-Key zählt ein erneuter Versuch nie doppelt und stempelt nie doppelt.

  3. 03

    Die .tsr herunterladen

    GET /api/v2/proofs/{id}/qualified.tsr gibt die Antwort der Stelle unverändert zurück, in DER, bereit für OpenSSL.

curl https://sellat.app/api/v2/proofs \
  -H "Authorization: Bearer $SELLAT_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"hash":"<sha256 der Datei>","qualified":true}'

Jeder verbraucht einen Zeitstempel deines Kontos: den Willkommens-Zeitstempel oder einen aus deinen Paketen. Ist keiner mehr übrig, antwortet die API mit 402, bevor etwas erstellt wird.

Reichweite

Was es beweist, und was nicht.

Was es beweist

Ein gültiges RFC-3161-Token beweist, dass dieser Fingerabdruck, und damit genau diese Datei, spätestens zu der Uhrzeit existierte, die die Stelle signiert hat, und dass sie sich seitdem nicht verändert hat.

Was es nicht beweist

Es hält fest, seit wann die Datei existiert, nicht, seit wann das existiert, was ihr Inhalt zeigt. Es beweist weder Urheberschaft noch Inhaberschaft noch Wahrheitsgehalt; und die Uhrzeit ist so viel wert wie die Stelle, die sie signiert.

Häufige Fragen

Bevor du fragst.

Sind Zeitstempel, Timestamp und Zeitstempelung dasselbe?

Ja: ein Begriff mit mehreren Namen. Auf Englisch timestamp, auf Deutsch Zeitstempel oder Zeitstempelung, und die europäische Verordnung spricht vom „elektronischen Zeitstempel“. Was sich unterscheidet, ist nicht der Name, sondern ob er qualifiziert ist.

Was ist der Unterschied zwischen einer .tsr und einer .tst?

Die .tsr ist die vollständige Antwort der Stelle (TimeStampResp): der Status der Anfrage plus das Token. Die .tst ist nur das Token (TimeStampToken, ein CMS-SignedData). Viele Validatoren akzeptieren nur die .tst; mit OpenSSL liest man eine .tst, indem man -token_in ergänzt.

Warum sagt OpenSSL, es finde den Aussteller des Zertifikats nicht?

Weil das Zertifikat der Stelle, das du mit -CAfile übergibst, ein Blatt ist und keine CA, und OpenSSL versucht, die Kette bis zu einer Wurzel aufzubauen. Mit -partial_chain akzeptiert es das Blatt als Vertrauensanker und prüft den Zeitstempel.

Reicht eine kostenlose TSA?

Um technisch zu beweisen, dass eine Datei existierte, ja: Ein RFC-3161-Token ist ein RFC-3161-Token. Was du nicht bekommst, ist die gesetzliche Vermutung nach Art. 41 Abs. 2, die nur ein Zeitstempel eines qualifizierten Anbieters auf der EU-Vertrauensliste trägt.

Welche Uhrzeit zählt?

Im Zeitstempel die des Feldes genTime, die die Stelle in UTC signiert. Ein Sellat-Nachweis enthält außerdem die Uhrzeit der öffentlichen Verankerung: Das sind verschiedene Uhrzeiten aus verschiedenen Ebenen, und sie werden immer getrennt angezeigt.

Kann ich eine .tsr prüfen, die nicht von Sellat stammt?

Ja. OpenSSL und der Validator dieser Website akzeptieren eine .tsr oder .tst jeder Stelle. Der Validator nennt sie nur dann qualifiziert, wenn die Stelle auf der EU-Vertrauensliste als qualifizierter Dienst geführt wird.

Kann ich das automatisieren?

Ja. Die API nimmt Fingerabdrücke per HTTP an und gibt für jeden einen Nachweis zurück, ohne die Originale zu senden; außerdem gibt es ein Open-Source-Kommandozeilenwerkzeug. Wir nutzen es selbst, um jede Stunde Logs mit einem Zeitstempel zu versehen.

Und ein Blockchain-Zeitstempel wie OpenTimestamps?

Das ist eine andere Art, einen Fingerabdruck zu datieren, ohne Stelle: Der Fingerabdruck wird mit anderen in einem Merkle-Baum zusammengefasst und in einer öffentlichen Kette wie Bitcoin verankert, und die Uhrzeit ist die des Blocks. Das ist kein RFC-3161-Token und kann nicht qualifiziert sein, hängt aber nicht davon ab, dass es irgendjemanden weiterhin gibt. Sellat verankert jeden Nachweis auf diese Weise; die Seite zum Existenznachweis erklärt es.

Hast du gerade eine .tsr vor dir?

Prüfe sie im Browser mit ihrer Datei. Wenn du Zeitstempel aus deinem eigenen System ausstellen willst, beginne mit der API.

Validator öffnen Aus deinem eigenen System ausstellen: die API →