Wie kann ich RFC3161 (vertrauenswürdige) Zeitstempel verwenden, um das Alter der Commits in meinem Git-Repository zu überprüfen?

Aktualisierte

ich habehat ein Skript gepostet Ich verwende dafür die StackExchange Code Review-Site.

Meine ursprüngliche Frage dazu warGibt es eine Möglichkeit, ein Git-Commit mit einem X.509-Zertifikat und einem Zeitstempel zu signieren?. Für eine Weile dachte ich, ich könnte nur Dinge bekommen, die ich mit meinem X.509-Zertifikat signiert habe und die von einem vertrauenswürdigen Dritten mit einem Zeitstempel versehen wurden. Das ist nicht der Fall. Digitale Signaturen mit einem X.509-Zertifikat und vertrauenswürdige Zeitstempel schließen sich gegenseitig aus. Ich habe meine Frage aktualisiert, um dies widerzuspiegeln.

Wie von VonC herausgestellt, bringt das Signieren von Git-Commits mit einem X.509-Zertifikat keinen Mehrwert. Die Verwendung eines GPG-Schlüssels ist aufgrund der integrierten Unterstützung von Git eine viel bessere Option.

Ich habe Gregs Antwort akzeptiert, weil sie meiner Frage am nächsten kommt, obwohl meine ursprüngliche Frage etwas mehrdeutig war. Greg weist darauf hin, dass Sie, wenn Sie nachweisen können, dass Sie zu einem bestimmten Zeitpunkt einen Commit-Hash kannten, sicher sind, dass Sie den Repository-Inhalt kennen, für den der Hash zu diesem Zeitpunkt bestimmt ist, und dass keine zusätzlichen Daten im Repository gespeichert werden müssen. Die Zeitstempeldaten können überall gespeichert werden.

Es ist möglich zu verwendenopenssl (v1.0.0 +) undcurl RFC3161-Zeitstempel für Commit-Hashes anfordern.

Einen Zeitstempel anfordern

Hierfür benötigen Sie einige Informationen:

URL - Ein RFC3161-ZeitstempelserviceREV - Die Revision (Hash), für die Sie einen Zeitstempel möchten. Muss ein voller Hasch sein.
CONTENT_TYPE="Content-Type: application/timestamp-query"
ACCEPT_TYPE="Accept: application/timestamp-reply"

openssl ts -query -cert -digest "$REV" -sha1 \
    | curl -s -H "$CONTENT_TYPE" -H "$ACCEPT_TYPE" --data-binary @- $URL

Der obige Befehl gibt den vorzeichenbehafteten Zeitstempel an ausstdout. Möglicherweise wird auch ein Fehler ausgegeben, wenn der Zeitstempeldienst die Anforderung ablehnt.

Überprüfen Sie einen Zeitstempel

Dies ähnelt dem Anfordern eines Zeitstempels, Sie benötigen jedoch auch:

CAFILE - Eine Zertifikatkette vom Zeitstempeldienst zurück zu einer Stammzertifizierungsstelle

Der Zeitstempeldienst sollte Zeitstempel mit einem Zertifikat signieren, das von einer vertrauenswürdigen Stelle ausgestellt wurde. Wenn nicht, haben Ihre Zeitstempel nicht viel Glaubwürdigkeit. Wenn Sie keine richtige Zertifikatskette finden oder erstellen können, verwenden Sie diecacert.pem veröffentlicht voncurl. Es istHier.

Das folgende Snippet geht davon aus, dass eine vorhandene, signierte Zeitstempelantwort an übergeben wirdstdin. Es sollte möglich sein, die obige Anforderung direkt an den folgenden Überprüfungsbefehl weiterzuleiten. Wenn Sie die Antwort von der Anfrage in einer Variablen speichern, muss sie möglicherweise von base64 codiert / decodiert werden (man base64).

openssl ts -verify -digest "$REV" -in /dev/stdin -CAfile "$CAFILE"

Wenn Sie eine Antwort prüfen, werden Sie feststellen, dass der Anforderungsauszug mit der verwendeten Git-Revision übereinstimmt. Mit diesem Befehl können Sie eine Nur-Text-Version einer Antwort überprüfen.

openssl ts -reply -in /dev/stdin -text

Hier ist ein Beispiel für eine Antwort, bei der ich die Git-Revision oben hinzugefügt habe.

--------------------------------------------------------------------------------
Revision: 871d715e5c072b1fbfacecc986f678214fa0b585
--------------------------------------------------------------------------------
Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified

TST info:
Version: 1
Policy OID: 1.3.6.1.4.1.6449.2.1.1
Hash Algorithm: sha1
Message data:
    0000 - 87 1d 71 5e 5c 07 2b 1f-bf ac ec c9 86 f6 78 21   ..q^\.+.......x!
    0010 - 4f a0 b5 85                                       O...
Serial number: 0xB2EA9485C1AFF55C6FFEDC0491F257C8393DB5DC
Time stamp: Aug 15 08:41:48 2012 GMT
Accuracy: unspecified
Ordering: no
Nonce: 0x615F0BF6FCBBFE23
TSA: DirName:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Time Stamping Signer
Extensions:
Weitere Hinweise

Bei vielen Zeitstempeldiensten werden Benutzer aufgefordert, skriptgesteuerten Signaturanforderungen eine Verzögerung hinzuzufügen. Stellen Sie sicher, dass Sie herausfinden, ob der von Ihnen geplante Dienst dies erfordert. Zum Zeitpunkt des Schreibens der von mir verwendeten Version fordert Comodo eine Verzögerung von 15 Sekunden zwischen den Skriptanforderungen an. Der einzige Grund, warum ich mich für Comodo entschieden habe, ist der, bei dem ich mein Codesignaturzertifikat gekauft habe.

Git-Notizen scheinen die naheliegende Wahl für das Speichern signierter Zeitstempel-Antworten zu sein, aber ich habe keine vollständige Lösung zum Posten. Ich stecke festdiese im Moment.

Meine ursprüngliche Frage und Updates sind unten.

Ich würde gerne in der Lage sein, zu beweisenwann Meine Git-Commits laufen und der Verlauf meines Repository wurde nicht neu geschrieben. Es muss nicht jedes Commit sein. Einmal am Tag oder einmal in der Woche wäre ausreichend. Gibt es einen empfohlenen Weg, dies zu tun?

Ich weiß, dass ich Git-Commits mit einem GPG-Schlüssel signieren kann, aber ich frage mich, ob ich meine Commits mit einem X.509-Zertifikat und der Verwendung eines Online-Zeitstempeldienstes wie z. B. signieren kannhttp://timestamp.comodoca.com/rfc3161.

Wenn nicht, würde die aktuelle Revision mit dumpengit rev-parse --verify HEAD einmal am Tag in eine Textdatei schreiben, diese Datei signieren und bestätigen, dass es ausreicht, um (ungefähr) zu beweisen, wann mein Code geschrieben wurde?

Info für Klarheit hinzugefügt

Ich weiß, dass Git die Integrität eines Repositorys garantiert, aber wenn ich das Repository kontrolliere, müsste ein Dritter darauf vertrauen, dass ich den Verlauf des Repositorys nicht neu geschrieben oder meine Uhr zurückgesetzt und zurückgesetzt habe ein vollständig gefälschtes Repository erstellt, um zu 'beweisen', dass mein Code älter ist als er tatsächlich ist? Ich möchte mein Repository auch nicht öffentlich veröffentlichen.

Hier ist ein fiktiver Anwendungsfall, der eine bessere Vorstellung davon geben soll, was ich tun möchte.

Ich veröffentliche Code online. Ein Jahr später kopiert und veröffentlicht jemand denselben Code in einem Buch oder Artikel und behauptet, ich sei derjenige, der sie kopiert hat. An diesem Punkt möchte ich in der Lage sein, mein Repository zu übernehmen und zu beweisen, dass ich diesen Code vor einem Jahr festgeschrieben habe, bevor sie ihn erneut veröffentlichten.

Indem ich ein X.509-Zertifikat mit einem Zeitstempeldienst verwende, kann ich dies nachweisenwann Die Unterzeichnung erfolgte. Solange ich nachweisen kann, dass ich den Hash des einjährigen Commits kenne, garantiert Git die Integrität des Archivs.

Gibt es eine Möglichkeit, ein Commit mit einem GPG-Schlüssel, jedoch mit einem verifizierten Zeitstempel, zu signieren? Gibt es einen vertrauenswürdigen Drittanbieter, der einen Zeitstempeldienst anbietet, der dem für X.509-Zertifikate, jedoch für GPG, vergleichbar ist?

Vielleicht könnte ich eine Kombination aus einem GPG-Schlüssel und einem X.509-Zertifikat verwenden. Angenommen, ich habe eine Kopie meines (öffentlichen) GPG-Schlüssels im Repository. Würde das folgende funktionieren, wenn ich es am Ende eines jeden Tages tun würde?

Signieren Sie meinen (öffentlichen) GPG-Schlüssel mit meinem X.509-Zertifikat und einem Online-Zeitstempeldienst.Übernehmen Sie die Änderung mit einer Signatur von meinem (privaten) GPG-Schlüssel in das Repository.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage