我有一个Git仓库,里面有一堆签名的Git提交和一组GPG公钥导入到我的本地密钥链中。我希望(a)验证给定提交的签名是有效签名,以及(b)确定哪个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做在他们的web界面,但我想做到这一点在本地和编程。最好,我想在Python中做到这一点,但如果没有Python机制存在,可以退回到对gpg命令进行子进程调用。
关于如何验证签名提交并确定签名提交的密钥(指纹)有什么建议吗?
这最好通过调用GnuPG来完成,因为它为您做了很多工作。命令行git verify-commit --raw
显示了GnuPG的--status-fd
选项的原始输出,您可以对其进行解析以确定信息。例如,以下是我提交的一些数据(经过处理以排除我的电子邮件):
[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的一部分。密钥为版本4 EdDSA密钥(类型22),签名算法为SHA-512(类型10)。请注意,您可能想要验证所使用的签名算法不是MD5或SHA-1,因为已知这两种算法都是不安全的。
请注意,对于提交,签名存储在gpgsig
(用于SHA-1)或gpgsig-sha256
(用于SHA-256)标头中,或者两者都存储。签名的数据是没有这些头的整个提交数据。可能是GitPython提供了一种单独提取这些项的方法,也可能是你必须自己做。
标签的算法不同于提交。