Подтвердить что ты не робот

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

Обновление

У меня размещен script, который я использую для этого на сайте обзора StackExchange Code.

Мой первоначальный вопрос для этого был Есть ли способ, которым я могу заключить комманду 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 - цепочка сертификатов из службы timestamp обратно в корневой CA

Служба штамповки времени должна указывать отметки времени с сертификатом, который был выпущен доверенным органом. Если нет, ваши метки времени не имеют большого доверия. Если вы не можете найти или создать надлежащую цепочку сертификатов, попробуйте использовать 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 кажутся очевидным выбором для хранения подписанных ответов timestamp, но у меня нет полного решения для публикации. На данный момент я застрял в этом.

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


Я хотел бы иметь возможность доказать , когда выполняются мои транзакции 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 в репозитории, будет ли следующая работа, если бы я делал это в конце каждого дня?

  • Подпишите мой (общедоступный) ключ GPG с помощью моего сертификата X.509 и онлайн-штамповки.
  • Зафиксировать изменение в репозитории с помощью подписи из моего (закрытого) ключа GPG.
4b9b3361

Ответ 1

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

Ответ 2

Просто добавьте сертификат с меткой времени к вашему последнему фиксации. Sha1 проверяет, что сертификат не был изменен, и сам сертификат будет проверять все те "факты", которые он запрашивает, например, отметку даты и времени с доверенного сервера, и кто вы утверждаете, и т.д. есть, фиксация подписывает сертификат в соответствии с цитатой VonC из речи Линуса; -)


[EDIT] Очевидно, что вам нужно опубликовать sha1 этого нового коммита, иначе вы можете его изменить (и сертификат) и использовать новый sha1, чтобы требовать все, что находится в этой новой истории фиксации. Как всегда, это создает сеть взаимного доверия.

Ответ 3

Я не понимаю, потому что Линус сделал Git с этой специфической особенностью (т.е. целостность того, что вы вкладываете, именно то, что выходит)

Смотрите 2007 речь в Google (transcript):

Большинство из них я мог отбросить, даже не попробовав их.

  • Если вы не распределены, вам не стоит использовать, это так просто.
  • Если вы плохо себя чувствуете, вам не стоит пользоваться, это так просто.
  • И если вы не можете гарантировать, что материал, который я помещаю в SCM, получается точно так же, вам не стоит использовать.

Совершенно откровенно, что в значительной степени позаботился обо всем.

Существует много систем SCM, которые не гарантируют, что то, что вы получите от него снова, - это то же самое, что вы вложили.
Если у вас повреждение памяти, если у вас повреждение диска, вы, возможно, никогда не узнаете. Единственный способ узнать, что вы заметили, что в файлах есть коррупция, когда вы их проверяете. И система управления исходным кодом не защищает вас вообще.
И это даже не редкость. Это очень распространено..

Поэтому я не думаю, что добавление другой функции целостности добавит любое значение.
И "метка времени" тоже не совсем хорошая идея, поскольку они не записываются для DVCS в первую очередь (см. "Git: проверка старого файла с оригиналом создавать/изменять временные метки" и "Что эквивалентно использованию-commit-times для git?" )

Ответ 4

Я просто написал для этой цели программу под названием " GitLock". Он добавляет надежные временные метки к вашему репо.

https://www.npmjs.com/package/gitlock