Я разместил скрипт , который я использую для этого, на сайте проверки кода StackExchange.
Мой первоначальный вопрос по этому поводу был Есть ли способ подписать коммит Git с сертификатом X.509 и отметкой времени? . Некоторое время я думал, что могу получить только те вещи, которые я подписал с помощью моего сертификата X.509 с отметкой времени доверенной третьей стороны. Это не вариант.Цифровая подпись с сертификатом X.509 и доверенная отметка времени являются взаимоисключающими. Я обновил свой вопрос, чтобы отразить это.
Как указывает VonC, подписание коммитов Git сертификатом X.509 не добавляет никакой ценности. Использование ключа GPG — гораздо лучший вариант из-за встроенной поддержки Git.
Я принял ответ Грега, потому что он ближе всего к тому, о чем я просил, хотя мой первоначальный вопрос был немного двусмысленным. Как указывает Грег, если вы можете доказать, что знали хэш коммита в определенный момент времени, это гарантирует, что вы знали содержимое репозитория, для которого этот хеш был в это время, и нет необходимости хранить какие-либо дополнительные данные в репозитории. Данные метки времени могут храниться где угодно.
Можно использоватьopenssl
(v1.0.0+ )и curl
для запроса меток времени RFC3161 для хэшей коммитов.
Для этого вам понадобится немного информации:
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
. Он также может вывести ошибку, если служба меток времени отклоняет запрос.
Это очень похоже на запрос метки времени, но вам также потребуется:
Служба отметки времени -должна подписывать отметки времени сертификатом, выданным доверенным центром. Если нет, то ваши временные метки не вызывают большого доверия. Если вы не можете найти или создать правильную цепочку сертификатов, попробуйте использовать 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 в репозитории, сработает ли следующее, если я буду делать это в конце каждого дня?