第13章:GPG签名
基础知识
GnuPG (gpg) 可以用来对任意信息对称/非对称加密、签名。 在Git中再次加密意义不大(git fetch/git push时信道已经是安全的了),但是签名却有很大用处。 Git中有两种对象可以签名:commit和tag。
在开始之前,先导入私钥:
gpg --armor --import <<EOF
-----BEGIN PGP PRIVATE KEY BLOCK-----
lQHYBF6/LzQBBADbUJy0qahjTV/4LGdqXFr4PPmJQReFTdpIH6GHJuuwxoT4OJ9k
xJiMcAuesf0QYNZc5DnM7uoxRYStNggt/jAln2end8jNaCpUiZ0SyBBlhdv5yGPq
zaUSD7+5Y8GLpd+s/polyGyCX/L9Mn0/rkn0zJfMaRfvQaA+mR7YJjwL1QARAQAB
AAP8DpYUMgzVmvMmtpwHbcLCNx/hDdCjNpW4tpLJ/LHpO4rchaDIcxyDM9Xw4+dd
GCWEpE12jat3Lns76YQ+M4bkH0Dh8UBd+waX68+kcUC+0GH880CawLy3+4PR3wW6
qXYWlwqEA51iL8/3jLIQe8NiohU83SGRkMJho579ZcW92cECAN9x6Qwl/NbFsxP6
eD/xJv/STG0n0Lz48iZ69IIrDAabtSkYjRQrRTqC9f9QB81vCdR6QWCa4Q3mCGm7
KU35QEECAPtEqFzo7s+QgmpqxRoJ8joizO/BDU6jCWnieZSQbFfbyKpod05Z3Zge
7HwRWF12S97g1g2Z8n+HDjmMi5ygJpUCAIOnZK2wgRivsCnTc7AqGRglbPRqMmAz
5p4CNd5LWU8IoBcKAvhX4YEj5/aQ4YYtlPZGVSBa15l7bx7x8syheMWlT7QZU2ln
bmVyIDxzaWduZXJAZ21haWwuY29tPojOBBMBCgA4FiEEs092T1lcEcqWb2lru7hm
2TB0/18FAl6/LzQCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQu7hm2TB0
/19GKgQAn3ZfX1+50QNS27c+xhzyJeVutwV6kUsBCSmWYfJ0q4CGbLDMECJ8Sv8X
gJvIC+Ep3gUNZ3oFv1T7ql7tgPbyw99kYWTuhDNtxcPNfBTfULYzzxgrBERITaVC
yO57uB50x88xJUwRNmt2PK/m0hrstmEH6IjaJqKCr/juLjDmnEudAdgEXr8vNAEE
ALhR/Z4xaCi4riHT/2IDoca0CIMp+RwOLQAtK5s+0ldyT8OBUA32J2MiFKOMJw/D
QL3ImBUkKuwRfI6610KkGPTXny5z5b1vOk4QQUncG5UOyFIv8FWep9uZTbnFLzbb
Kj0+HiZoTxJBw99M7b1/4vmjOHj2H4wTN2foHgeL8uXXABEBAAEAA/0SAX8fQ9/9
0Q4VuOeC/tbVb0NA8587Dzl0gcp3kntVgTxrMrKMLUaWEmoQu1bE3UPxpkBmbvo7
GyQ0rz+Vv4ETyNJFEkkf4eltuRHLgC3aav3hGAyVEUnlMgS8bpu6DgiPhE2yJ/x5
d0VBUxzAh8MOVLjlZvONRC8sjFmJA3ibgQIAyU6mUusr3k4OQETWyz+cEHHOw85A
qgWLOc4R0AYF01meV9zNcCVI2jVxyUct5+db01Ndsxk+vpflhHFOUXF3VwIA6mXc
thgDDYqjDWDCZmjT5iCpWINB88MyYUYtcgMlARKVQTqytH6G0TfpzCgGU4XJNM4W
3Nxtc0MC56dB7b11gQH+PyRO79LGXvMw+cVqejU+3VkElraNXrdWuDKeiCXHt0BW
EUg/SjFVomxjktOUfr35CqBMAAayi5JNuR5kCUSnjJbEiLYEGAEKACAWIQSzT3ZP
WVwRypZvaWu7uGbZMHT/XwUCXr8vNAIbDAAKCRC7uGbZMHT/X3YaBACsOjO0kFFk
4nIE2Fl/VawPU0T7vcfgF4MsPoZLSyj9YhQvNJrmPRcetkK4hNOlauS05UHS0nPH
0xONCobsjndOZ8UfS4/qrKRuHpPeA0f5SHnsdAUJNeMt2MCoT9aTU6Pzs2ES+/o9
L93cMAl+Cmb1MeRlT04sWqncgLjJ4zgZ/Q==
=kxtM
-----END PGP PRIVATE KEY BLOCK-----
EOF
# gpg: directory '/root/.gnupg' created
# gpg: keybox '/root/.gnupg/pubring.kbx' created
# gpg: /root/.gnupg/trustdb.gpg: trustdb created
# gpg: key BBB866D93074FF5F: public key "Signer <signer@gmail.com>" imported
# gpg: key BBB866D93074FF5F: secret key imported
# gpg: Total number processed: 1
# gpg: imported: 1
# gpg: secret keys read: 1
# gpg: secret keys imported: 1
gpg --import-ownertrust <<EOF
B34F764F595C11CA966F696BBBB866D93074FF5F:6:
EOF
# gpg: inserting ownertrust of 6
# gpg: checking the trustdb
# gpg: marginals needed: 3 completes needed: 1 trust model: pgp
# gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg --list-secret-keys
# /root/.gnupg/pubring.kbx
# ------------------------
# sec rsa1024 2020-05-16 [SC]
# B34F764F595C11CA966F696BBBB866D93074FF5F
# uid [ultimate] Signer <signer@gmail.com>
# ssb rsa1024 2020-05-16 [E]
#本章在第6章的基础之上继续。
创建带签名的commit
Lv1
Lv2
Lv3
验证commit的签名
Lv1
Lv2
创建带签名的tag
Lv1
Lv3
验证tag的签名
Lv1
Lv2
Lv3
带签名的tag与merge
第6章中提到,对于带有签名(见第13章)的tag,其被merge时会将其信息存储于新创建的commit的mergetag中,以备后续检查。
首先做好tag:
Lv1 较为复杂,略
Lv3
进行merge:
可以发现带有签名的tag整体出现在了mergetag中。 注意:即便不使用-S<keyid>添加gpgsig,mergetag依然会存在。
验证签名:
其他
关于git log
git log可以在git log中检查签名:
然而第8章中的git lg/la/ls均已将签名检查融入其中,无需再添加--show-signature。
关于git config
git config设置user.signingKey可以省去每次输入<keyid>。 设置commit.gpgSign可以在每次git commit时都-S。 设置tag.gpgSign可以在每次git tag时都-a -s;注意这导致无法创建普通的refs/tags/...而不创建tag object。
关于GitHub
GitHub对于在网页上作出的更改,会使用以下信息进行签名:
为了验证这些commit的有效性,以下两种方法可以二选一:
总结
创建签名
Lv2
git commit-tree -S[<keyid>] ...
Lv3
git commit -S[<keyid>] ...git tag -a -s [-u <keyid>]
验证签名
Lv2
git verify-commit <commit-ish>git verify-tag <tag-ish>
Lv3
git show -s --show-signature <commit-ish>git tag --verify <tag-ish>git log --show-signature ...
最后更新于
这有帮助吗?