Обновлено
У меня есть опубликовал сценарий, который я использую для этого, на сайте проверки кода 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
. Должна быть возможность направить вышеуказанный запрос напрямую в приведенную ниже команду verify. Если вы сохраняете ответ на запрос в переменной, может потребоваться его кодирование / декодирование 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 в репозитории, будет ли работать следующее, если я буду делать это в конце каждого дня?
- Подпишите мой (публичный) ключ GPG, используя мой сертификат X.509 и онлайн-службу отметок времени.
- Зафиксируйте изменение в репозитории с подписью моего (частного) ключа GPG.