Проверка подписанных git-коммитов?
С более новыми версиями git
можно подписывать отдельные коммиты (в дополнение к тегам) с помощью ключа PGP:
git commit -m "some message" -S
а вы можете показать эти подписи в выводе git log
С :
$ git log --show-signature
commit 93bd0a7529ef347f8dbca7efde43f7e99ab89515
gpg: Signature made Fri 28 Jun 2013 02:28:41 PM EDT using RSA key ID AC1964A8
gpg: Good signature from "Lars Kellogg-Stedman <lars@seas.harvard.edu>"
Author: Lars Kellogg-Stedman <lars@seas.harvard.edu>
Date: Fri Jun 28 14:28:41 2013 -0400
this is a test
но есть ли способ программно проверить подпись на данном коммите, кроме как путем grepping вывода git log
? Я ищу эквивалент фиксации git tag -v
-- что-то, что обеспечит код выхода, указывающий была ли действительная подпись на данном коммите или нет.
3 ответа:
на всякий случай, если кто-то придет на эту страницу через поисковую систему, как и я: Новые инструменты были доступны в течение двух лет с момента публикации вопроса: теперь есть команды git для этой задачи:
git verify-commit
иgit verify-tag
может использоваться для проверки коммитов и тегов соответственно.
Примечание: до git 2.5,
git verify-commit
иgit verify-tag
отображается только читаемое сообщение человека.
Если вы хотите автоматизировать проверку, git 2.6+ (Q3 2015) добавляет еще один выход.посмотреть commit e18443e,commit aeff29d,commit ca194d5,совершить 434060e,commit 8e98e5f, commit a4cc18f, commit d66aeff (21 июня 2015) by Брайан м. Карлсон (
bk2204
).
(слитый Junio C Hamano--gitster
-- на commit ba12cb2, 03 авг 2015)
verify-tag
/verify-commit
: добавить возможность печати необработанной информации о состоянии gpg
verify-tag
/verify-commit
по умолчанию отображает читаемый человеком вывод на стандартную ошибку.
однако также может быть полезно получить доступ к необработанной информации о состоянии gpg, которая машиночитаемый, позволяющий автоматизировать реализацию политики подписи.добавить a
--raw
опции сделатьverify-tag
произведите информацию о состоянии gpg на стандартной ошибке вместо людск-читаемого формата.плюсы:
verify-tag
успешно завершает работу, если подпись хорошая, но ключ недоверяемый.verify-commit
завершается неудачно.
Это расхождение в поведении является неожиданным и нежелательный.
Так какverify-tag
существовал ранее, добавьте неудачный тест, чтобы иметьverify-commit
долю 'ы.
git 2.9 (июнь 2016) обновление git merge doc:
посмотреть совершить 05a5869 (13 мая 2016) by Келлер Фукс (`).
Помог-by:Junio C Hamano (gitster
).
(слитый Junio C Hamano--gitster
-- на совершить be6ec17, 17 мая 2016 года)--verify-signatures: --no-verify-signatures:
убедитесь, что фиксация наконечника боковой ветви, которая объединяется, подписана допустимым ключом, т. е. ключ с допустимым uid: в модели доверия по умолчанию это означает, что ключ подписи был подписан доверенным ключом.
Если фиксация наконечника боковой ветви не подписана допустимым ключом, слияние прерывается.
Обновление Git 2.10 (Q3 2016)
посмотреть commit b624a3e (16 авг 2016) by Линус Торвальдс (
torvalds
).
(слитый Junio C Hamano--gitster
-- на совершить 83d9eb0, 19 авг 2016)
gpg-interface
: предпочитайте вывод" длинного " формата ключа при проверке подписей pgp"
git log --show-signature
" и другие команды, которые отображают статус проверки подписи PGP теперь показывает более длинный ключ-id, так как 32-битный ключ-id - это так в прошлом веке.оригинал Linus был перебазирован, чтобы применить к треку обслуживания только в том случае, если двоичные дистрибьюторы, которые застряли в прошлом, хотят взять его в свою старую кодовую базу.
Git 2.11+ (Q4 2016) будет еще точнее.
посмотреть совершить 661a180 (12 окт 2016) by Michael J Gruber (
mjg
).
(слитый Junio C Hamano --gitster
-- на совершить 56d268b, 26 окт 2016)состояние проверки GPG, показанное в "
%G?
" pretty format specifier не был достаточно богат, чтобы отличить подпись, сделанную истекшим ключом, подпись, сделанную отозванным ключом, и т. д.
новые выходные буквы были назначены, чтобы выразить их.по данным gpg2 это
doc/DETAILS
:для каждой подписи только один из кодов
GOODSIG
,BADSIG
,EXPSIG
,EXPKEYSIG
,REVKEYSIG
илиERRSIG
будет испускаться.The
git pretty-format
документация в настоящее время включают:
- '
%G?
': показать
- "
G
" за хорошую (действительную) подпись,- "
B
" за плохую подпись,- "
U
" за хорошую подпись с неизвестными действительность,- "
X
" за хорошую подпись, срок действия которой истек,- "
Y
" за хорошую подпись, сделанную просроченным ключом,- "
R
" за хорошую подпись, сделанную отозванным ключом,- "" если подпись не может быть проверена (например, отсутствует ) и "N" без подписи
Git 2.12 (Q1 2017)"
git tag
" и "git verify-tag
"узнал чтобы поставить статус проверки GPG в их "--format=<placeholders>
" формат вывода.посмотреть commit 4fea72f,commit 02c5433,commit ff3c8c8 (17 Jan 2017) by Сантьяго Торрес (
SantiagoTorres
).
Смотрите commit 07d347c,совершить 2111aa7,совершить 94240b9 (17 Jan 2017) by Lukas Puehringer (`).
(слитый Junio C Hamano --gitster
-- на commit 237bdd9, 31 янв 2017)добавлять
--format
доgit tag -v
отключает вывод GPG по умолчанию проверка и вместо этого печатает отформатированный объект тега.
Это позволяет абонентам перепроверять tagname из refs / тегов с помощью tagname из заголовка объекта тега при проверке GPG.
Git 2.16 (Q1 2018) позволит подтвердить подпись фиксации еще более автоматизированный, с
merge.verifySignatures
переменной конфигурации.посмотреть commit 7f8ca20,commit ca779e8 (10 дек 2017) by Hans Jerry Illikainen (`).
(слитый Junio C Hamano--gitster
-- на commit 0433d53, 28 Дек 2017)
merge
добавить параметр config дляverifySignatures
git merge --verify-signatures
может быть использован, чтобы убедиться, что кончик фиксации ветви, в которую объединяется, правильно подписана, но это громоздко нужно указывать это каждый раз.добавить параметр конфигурации, который позволяет это поведение по умолчанию, который может быть переопределен
--no-verify-signatures
.The
git merge
config man page гласит:merge.verifySignatures:
если true, то это эквивалентно
--verify-signatures
командная строка выбор.
Git 2.19 (Q3 2018) еще более полезен, так как"
git verify-tag
" и "git verify-commit
"научились использовать статус выхода базового"gpg --verify
" чтобы сигнализировать плохую или ненадежную подпись, которую они нашли.посмотреть commit 4e5dc9c (09 Авг 2018) by Junio C Hamano (
gitster
).
Помог-by: Vojtech Myslivec (VojtechMyslivec
),Брайан м. Карлсон (bk2204
) и Джефф Кинг (peff
).
(слитый Junio C Hamano--gitster
-- на совершить 4d34122, 20 авг 2018)
gpg-interface
: распространение статуса выхода изgpg
назад к звонящимкогда GPG-интерфейс API унифицировал поддержку кодовых путей проверки подписи для подписанных тегов и подписанных коммитов в середине 2015 года примерно на v2.6.0-rc0~114, мы случайно ослабили проверку подписи GPG.
перед этим изменением подписанные коммиты были проверены путем поиска "
G
"подпись ood от GPG, игнорируя статус выхода"gpg --verify
" процесс, в то время как подписано теги были проверены, просто передав статус выхода"gpg --verify
" до конца.единый код, который мы в настоящее время имеем, игнорирует статус выхода "
gpg --verify
" и возвращает успешную проверку, когда подпись соответствует неистекшему ключу независимо от доверия, помещенного на ключ (т. е. В дополнение к "G
"ООД, мы принимаем "U
" ntrusted ones).сделать эти команды сигнализируют о сбое с их статусом выхода при базовом"
gpg --verify
" (или пользовательская команда, указанная"gpg.program
" переменная конфигурации) делает так.
Это существенно изменяет их поведение обратно несовместимым образом, чтобы отклонить подписи, которые были сделаны с ненадежными ключами, даже если они правильно проверяют, как это"gpg --verify
" ведет себя.обратите внимание, что код по-прежнему переопределяет нулевой статус выхода, полученный из "
gpg
" (илиgpg.program
) если вывод не говорит, что подпись хороша или вычисляется правильно, но сделана с ненадежным ключи, чтобы поймать плохо написанную обертку вокруг"gpg
" пользователь может дать нам.мы могли бы исключить "
U
" поддержка ntrusted из этого резервного кода, но это будет делать два обратно несовместимых изменения в одной фиксации, поэтому давайте пока этого избегать.
Последующее изменение может сделать это при желании.
беглый осмотр кода говорит о том, что нет такой прямой способ.
все тесты в источнике git полагаются на
grep
пинг выходеgit show
(см. t/t7510-signed-commit.sh для тестов).вы можете настроить вывод через что-то вроде
--pretty "%H %G?%"
чтобы сделать его легко разобрать.кажется, вы можете задать
git merge
чтобы проверить подпись, но опять же, его тесты полагаются наgrep
(см. t/t7612-merge-verify-signatures.sh). похоже, что недопустимая подпись вызоветgit merge
чтобы выйти с плохой подписью, поэтому вы могли бы сегодня взломать это, выполнив тестовое слияние где-то и выбросив это слияние, но это кажется хуже, чем просто вызов grep.