Как я могу использовать доверенные временные метки RFC3161 (), чтобы подтвердить возраст коммитов в моем репозитории Git?

Обновлено

Я разместил скрипт , который я использую для этого, на сайте проверки кода StackExchange.

Мой первоначальный вопрос по этому поводу был Есть ли способ подписать коммит Git с сертификатом X.509 и отметкой времени? . Некоторое время я думал, что могу получить только те вещи, которые я подписал с помощью моего сертификата X.509 с отметкой времени доверенной третьей стороны. Это не вариант.Цифровая подпись с сертификатом X.509 и доверенная отметка времени являются взаимоисключающими. Я обновил свой вопрос, чтобы отразить это.

Как указывает VonC, подписание коммитов Git сертификатом X.509 не добавляет никакой ценности. Использование ключа GPG — гораздо лучший вариант из-за встроенной поддержки Git.

Я принял ответ Грега, потому что он ближе всего к тому, о чем я просил, хотя мой первоначальный вопрос был немного двусмысленным. Как указывает Грег, если вы можете доказать, что знали хэш коммита в определенный момент времени, это гарантирует, что вы знали содержимое репозитория, для которого этот хеш был в это время, и нет необходимости хранить какие-либо дополнительные данные в репозитории. Данные метки времени могут храниться где угодно.

Можно использоватьopenssl(v1.0.0+ )и curlдля запроса меток времени RFC3161 для хэшей коммитов.

Запрос метки времени

Для этого вам понадобится немного информации:

  • URL -Служба отметки времени RFC3161 -
  • REV -Ревизия (хэш ), для которой требуется временная метка. Должен быть полный хеш.
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

Приведенное выше выведет временную метку со знаком в stdout. Он также может вывести ошибку, если служба меток времени отклоняет запрос.

Проверить метку времени

Это очень похоже на запрос метки времени, но вам также потребуется:

  • CAFILE -Цепочка сертификатов от службы меток времени обратно к корневому ЦС

Служба отметки времени -должна подписывать отметки времени сертификатом, выданным доверенным центром. Если нет, то ваши временные метки не вызывают большого доверия. Если вы не можете найти или создать правильную цепочку сертификатов, попробуйте использовать cacert.pem, опубликованную curl. Это здесь .

В приведенном ниже фрагменте предполагается, что существующий подписанный ответ с отметкой времени передается на stdin. Должна быть возможность направить вышеуказанный запрос непосредственно в приведенную ниже команду проверки.Если вы храните ответ на запрос в переменной, может потребоваться кодирование/декодирование base64(man base64).

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

Если вы изучите ответ, вы заметите, что дайджест запроса соответствует используемой версии Git. С помощью этой команды вы можете просмотреть текстовую версию ответа.

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

Вот пример ответа, в котором я добавил версию Git вверху.

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

Другие примечания

Службы штамповки -часто просят пользователей добавить задержку к запросам на подпись по сценарию. Обязательно узнайте, требует ли это услуга, которую вы планируете использовать. Во время написания того, что я использую, Comodo запрашивает 15-секундную задержку между скриптовыми запросами. Единственная причина, по которой я решил использовать Comodo, заключается в том, что именно у него я купил свой сертификат подписи кода.

Заметки Git кажутся очевидным выбором для хранения подписанных ответов с отметками времени, но у меня нет полного решения для публикации. В данный момент я застрял на этом .

Мой оригинальный вопрос и обновления ниже.


Я хотел бы иметь возможность доказать , когда мои коммиты Git происходят, и что история моего репозитория не была переписана -. Это не обязательно должен быть каждый коммит. Раз в день или раз в неделю будет достаточно. Есть ли рекомендуемый способ сделать это?

Я знаю, что могу подписывать коммиты Git с помощью ключа GPG, но мне интересно, есть ли способ подписать свои коммиты с помощью сертификата X.509 и использования онлайн-сервиса штамповки времени -, такого какhttp://timestamp.comodoca.com/rfc3161.

Если нет, будет ли достаточно выгружать текущую ревизию с помощью git rev-parse --verify HEADв текстовый файл один раз в день, подписывать этот файл и фиксировать, чтобы доказать (приблизительно ), когда мой код был написан?

Добавлена ​​информация для ясности

Я знаю, что Git гарантирует целостность репозитория, но, насколько я понимаю,если я контролирую репозиторий, третья сторона должна будет поверить, что я не переписал -историю репозитория или не откатил свои часы назад и не создал полностью поддельный репозиторий только для того, чтобы «доказать», что мой код старше, чем он есть на самом деле. является? Я также не хочу публиковать свой репозиторий публично.

Вот вымышленные варианты использования, которые должны дать лучшее представление о том, что я хочу сделать.

Я публикую код онлайн. Год спустя кто-то копирует и публикует тот же код в книге или статье и утверждает, что это я их скопировал. В этот момент я хотел бы иметь возможность взять свой репозиторий и доказать, что я зафиксировал этот код год назад, до того, как они -опубликовали его.

Используя сертификат X.509 со службой отметки времени -, я могу подтвердить , когда произошло подписание. Пока я могу доказать, что знаю хеш коммита годовой давности, Git гарантирует целостность архива.

В качестве альтернативы, есть ли способ подписать фиксацию с помощью ключа GPG, но с проверенной отметкой времени -? Существует ли доверенная третья сторона, которая предоставляет услугу отметки времени -, аналогичную той, которая доступна для сертификатов X.509, но для GPG?

Возможно, я мог бы использовать комбинацию ключа GPG и сертификата X.509. Если предположить, что я храню копию своего (общедоступного )ключа GPG в репозитории, сработает ли следующее, если я буду делать это в конце каждого дня?

  1. Подпишите мой (общедоступный )GPG-ключ, используя мой сертификат X.509 и онлайн-сервис отметки времени -.
  2. Зафиксируйте изменение в репозитории с подписью моего (закрытого )ключа GPG.
18
задан Community 23 May 2017 в 11:33
поделиться