Обновление
У меня размещен 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.