#python #git #digital-signature #gnupg
Вопрос:
У меня есть репозиторий Git с кучей подписанных коммитов git и набором открытых ключей GPG, импортированных в мою локальную связку ключей. Я хочу (а) убедиться, что подпись для данной фиксации является действительной подписью, и (б) определить, какой открытый ключ GPG — какой отпечаток пальца GPG — связан с этой фиксацией.
Я бы предпочел использовать модуль GitPython для определения этого, но я не уверен, как выполнить любую из этих задач. Я могу вывести подпись GPG вот так.
from git import Repo
repo = Repo(repo_dir)
fifty_first_commits = list(repo.iter_commits('master', paths="dir/in/repo/", max_count=5000))
for c in fifty_first_commits:
try:
print(f"{'-'*50}n{c.message}n{c.hexsha}n{c.gpgsig}")
except:
pass
Выход:
--------------------------------------------------
jaz
8193646322775885d2d11764eb6e8ab7e1fe92bf
-----BEGIN PGP SIGNATURE-----
iQEzBAABCgAdFiEE7ut7Ul zbFDPnPJVLm85QNTo9lcFAmFco3kACgkQLm85QNTo
9lfzrgf/VTzvZVleZpsu3V0v9HSSskZn7KME5yTpa6et6GV/V0YtCJFeD6u8BaHE
eVS7II/G9QKmNvuU4p2VVpKFFWE0bzehb46/LL3pu8oEJzGckHCurtHiRo5OsyME
bPkSQXS7rNEUoqjbGCI1O4 oB9sg9Btt3LHsFkMA5xh9fY9ISFbyV74eiM5Ckk0/
ZQelz1yD9RjIMC jR0lyDzll4QlJi1y8rFKxv/Xg7LtoPCenxAkMurtDmbRIXR8I
Yvg8gMe13uUQbDkn5djz9/LDN34UHHDLdIqjklTEliFJQ3ou/7xsXqNKduQ79I8v
OXkJGhX WuL2aZIibFkumgm2DbJEhQ==
=Czw1
-----END PGP SIGNATURE-----
Однако я не уверен, как идентифицировать отпечаток пальца ключа, подписавшего коммит, или как узнать, действительна ли подпись с этим ключом.
В принципе, я хотел бы использовать GitLab и GitHub в их веб-интерфейсе, но я хочу сделать это локально и программно. Предпочтительно, я хотел бы сделать это на Python, но могу вернуться к вызову подпроцесса команды gpg, если для этого не существует механизма python.
Любые советы о том, как проверить подписанную фиксацию и определить, какой ключ (отпечаток пальца) опалил фиксацию?
Ответ №1:
Лучше всего это сделать, позвонив в GnuPG, потому что это делает для вас большую работу. В командной строке git verify-commit --raw
отображается необработанный вывод из --status-fd
опции GnuPG, который вы можете проанализировать, чтобы определить информацию. Например, вот некоторые данные из сделанного мной коммита (очищенные, чтобы исключить мою электронную почту):
[GNUPG:] NEWSIG
[GNUPG:] KEY_CONSIDERED 88ACE9B29196305BA9947552F1BA225C0223B187 0
[GNUPG:] SIG_ID tBxmB0d8obBLpGcTmDHwH5fWN60 2021-10-03 1633296963
[GNUPG:] KEY_CONSIDERED 88ACE9B29196305BA9947552F1BA225C0223B187 0
[GNUPG:] GOODSIG 7C0C49628887A281 brian m. carlson <filtered>
[GNUPG:] VALIDSIG 082CE68A9DBC65FB83D1C3917C0C49628887A281 2021-10-03 1633296963 0 4 0 22 10 00 88ACE9B29196305BA9947552F1BA225C0223B187
[GNUPG:] KEY_CONSIDERED 88ACE9B29196305BA9947552F1BA225C0223B187 0
[GNUPG:] KEY_CONSIDERED 88ACE9B29196305BA9947552F1BA225C0223B187 0
[GNUPG:] TRUST_ULTIMATE 0 tofu
Это означает, что подпись была сделана подразделом 082CE68A9DBC65FB83D1C3917C0C49628887A281, который является частью основного ключа 88ACE9B29196305BA9947552F1BA225C0223B187. Ключ является ключом EdDSA версии 4 (тип 22), а алгоритм подписи-SHA-512 (тип 10). Обратите внимание, что вы, вероятно, захотите проверить, что используемый алгоритм подписи не является MD5 или SHA-1, поскольку оба они, как известно, небезопасны.
Обратите внимание, что для фиксации подпись хранится в gpgsig
заголовке (для SHA-1) или gpgsig-sha256
(для SHA-256), или в обоих. Подписанные данные-это все данные фиксации без каких-либо из этих заголовков. Возможно, GitPython предоставляет способ извлечения этих элементов отдельно, или, возможно, вам придется сделать это самостоятельно.
Алгоритм для тегов отличается от коммитов.