Jak mogę wykorzystać znaczniki czasu RFC3161 (zaufane) do udowodnienia wieku zatwierdzeń w repozytorium Git?

Zaktualizowano

mamopublikował skrypt Używam do tego witryny recenzji recenzji StackExchange.

Moje pierwotne pytanie dotyczyło tegoCzy istnieje sposób na podpisanie zatwierdzenia Git za pomocą certyfikatu X.509 i znacznika czasu?. Przez pewien czas wydawało mi się, że mogę zdobyć tylko rzeczy, które podpisałem za pomocą certyfikatu X.509 oznaczonego datą przez zaufaną stronę trzecią. Nie o to chodzi. Podpisywanie cyfrowe z certyfikatem X.509 i zaufanym znacznikiem czasu wzajemnie się wykluczają. Zaktualizowałem moje pytanie, aby to odzwierciedlić.

Jak zauważył VonC, podpisanie Git zatwierdza certyfikatem X.509 nie dodaje żadnej wartości. Używanie klucza GPG jest znacznie lepszą opcją ze względu na wbudowaną obsługę Git.

Przyjąłem odpowiedź Grega, ponieważ jest najbliżej tego, o co prosiłem, mimo że moje oryginalne pytanie było nieco dwuznaczne. Jak zauważa Greg, jeśli uda ci się udowodnić, że znasz wartość mieszania w pewnym momencie, to gwarantuje, że znasz zawartość repozytorium, dla której mieszanie jest w danym momencie i nie ma potrzeby przechowywania żadnych dodatkowych danych w repozytorium. Dane znacznika czasu mogą być przechowywane w dowolnym miejscu.

Możliwe jest użycieopenssl (v1.0.0 +) icurl aby zażądać znaczników czasu RFC3161 dla skrótów zatwierdzania.

Żądaj znacznika czasu

Musisz mieć trochę informacji na ten temat:

URL - usługa znakowania czasem RFC3161REV - rewizja (skrót), dla której ma być znacznik czasu. Musi być pełnym hashem.
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

Powyższe spowoduje wyświetlenie podpisanego znacznika czasu dostdout. Może również wygenerować błąd, jeśli usługa znacznika czasu odrzuci żądanie.

Zweryfikuj znacznik czasu

Jest to bardzo podobne do żądania znacznika czasu, ale potrzebujesz także:

CAFILE - łańcuch certyfikatów od usługi znacznika czasu do głównego urzędu certyfikacji

Usługa znakowania czasem powinna podpisywać znaczniki czasu za pomocą certyfikatu wydanego przez zaufany organ. Jeśli nie, twoje znaczniki czasu nie mają dużej wiarygodności. Jeśli nie możesz znaleźć lub utworzyć odpowiedniego łańcucha certyfikatów, spróbuj użyćcacert.pem opublikowany przezcurl. Jegotutaj.

Poniższy fragment zakłada, że ​​przekazywana jest istniejąca, podpisana odpowiedź datownikastdin. Powinno być możliwe przekazanie powyższego żądania bezpośrednio do poniższego polecenia weryfikacji. Jeśli zachowasz odpowiedź z żądania w zmiennej, może być konieczne jej kodowanie / dekodowanie base64 (man base64).

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

Jeśli przeanalizujesz odpowiedź, zauważysz, że skrót żądania pasuje do wersji Git, która została użyta. Możesz sprawdzić wersję tekstową odpowiedzi za pomocą tego polecenia.

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

Oto przykład odpowiedzi, w której dodałem wersję Git na górze.

--------------------------------------------------------------------------------
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:
Inne notatki

Wiele usług znakowania czasem prosi użytkowników o dodanie opóźnienia do żądań podpisywania skryptów. Sprawdź, czy wymaga tego usługa, której zamierzasz użyć. W momencie pisania tego, którego używam, Comodo prosi o 15 sekundowe opóźnienie między żądaniami skryptowymi. Jedynym powodem, dla którego wybrałem Comodo, jest to, od kogo kupiłem certyfikat podpisywania kodu.

Notatki Git wydają się oczywistym wyborem do przechowywania podpisanych sygnatur czasowych, ale nie mam kompletnego rozwiązania do opublikowania. Utknąłemto w tym momencie.

Moje oryginalne pytanie i aktualizacje są poniżej.

Chciałbym móc to udowodnićgdy moje zatwierdzenia Git się zdarzają i historia mojego repozytorium nie została ponownie napisana. Nie musi to być każde zatwierdzenie. Wystarczy raz dziennie lub raz w tygodniu. Czy istnieje zalecany sposób, aby to zrobić?

Wiem, że mogę podpisać Git za pomocą klucza GPG, ale zastanawiam się, czy istnieje sposób, w jaki mogę podpisać swoje zobowiązania certyfikatem X.509 i skorzystać z usługi znakowania czasem online, takiej jakhttp://timestamp.comodoca.com/rfc3161.

Jeśli nie, wyrzuciłby bieżącą wersję używającgit rev-parse --verify HEAD do pliku tekstowego raz dziennie, podpisywanie tego pliku i zobowiązanie do udowodnienia (z grubsza), kiedy mój kod został napisany?

Dodano informacje o przejrzystości

Wiem, że Git gwarantuje integralność repozytorium, ale o ile rozumiem, jeśli kontroluję repozytorium, osoba trzecia musiałaby zaufać, że nie napisałem ponownie historii repozytorium ani nie cofnąłem zegara i nie cofnąłem zegara i stworzył całkowicie fałszywe repozytorium tylko po to, aby „udowodnić”, że mój kod jest starszy niż jest w rzeczywistości? Nie chcę też publicznie publikować mojego repozytorium.

Oto fikcyjne przypadki użycia, które powinny dać lepszy obraz tego, co chcę zrobić.

Publikuję kod online. Rok później ktoś kopiuje i publikuje ten sam kod w książce lub artykule i twierdzi, że to ja je skopiowałem. W tym momencie chciałbym móc zabrać moje repozytorium i udowodnić, że popełniłem ten kod rok temu, zanim ponownie go opublikowali.

Korzystając z certyfikatu X.509 z usługą znakowania czasem mogę to udowodnićgdy podpisanie nastąpiło. Tak długo, jak mogę udowodnić, że znałem hash dla rocznego zatwierdzenia, Git gwarantuje integralność archiwum.

Alternatywnie, czy istnieje sposób na podpisanie zatwierdzenia za pomocą klucza GPG, ale ze zweryfikowanym znacznikiem czasu? Czy istnieje zaufana strona trzecia, która zapewnia usługę znakowania czasem podobną do usługi dostępnej dla certyfikatów X.509, ale dla GPG?

Może mógłbym użyć kombinacji klucza GPG i certyfikatu X.509. Zakładając, że przechowuję kopię mojego (publicznego) klucza GPG w repozytorium, czy następujące czynności będą działać, jeśli zrobię to pod koniec każdego dnia?

Podpisz mój (publiczny) klucz GPG za pomocą certyfikatu X.509 i usługi znakowania czasem online.Zatwierdź zmianę w repozytorium podpisem z mojego (prywatnego) klucza GPG.

questionAnswers(4)

yourAnswerToTheQuestion