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