Git之深入解析如何通过GPG签署和验证工作

举报
Serendipity·y 发表于 2022/02/17 00:56:13 2022/02/17
【摘要】 一、GPG 了解了管理或者维护 Git 仓库、实现代码控制所需的大多数日常命令和工作流程,尝试跟了踪和提交文件的基本操作,并且掌握了暂存区和轻量级地分支及合并的威力。如果想进一步对 Git 深入学习,可...

一、GPG

$ gpg --list-keys
/Users/kody/.gnupg/pubring.gpg
---------------------------------
pub   2048R/0A46826A 2021-09-19
uid                  Scott Chacon (Git signing key) <kody@gmail.com>
sub   2048R/874529A9 2021-09-19

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 如果还没有安装一个密钥,可以使用 gpg --gen-key 生成一个:
$ gpg --gen-key

  
 
  • 1
  • 一旦有一个可以签署的私钥,可以通过设置 Git 的 user.signingkey 选项来签署:
$ git config --global user.signingkey 0A46826A

  
 
  • 1
  • 现在 Git 默认使用我们安装的密钥来签署标签与提交。

二、签署标签

  • 如果已经设置好一个 GPG 私钥,可以使用它来签署新的标签。所有需要做的只是使用 -s 代替 -a 即可:
$ git tag -s v1.5 -m 'my signed 1.5 tag'

You need a passphrase to unlock the secret key for
user: "Ben Straub <ben@straub.cc>"
2048-bit RSA key, ID 800430EB, created 2021-09-19

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 如果在那个标签上运行 git show,会看到 GPG 签名附属在后面:
$ git show v1.5
tag v1.5
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:29:41 2021 -0700

my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEcBAABAgAGBQJTZbQlAAoJEF0+sviABDDrZbQH/09PfE51KPVPlanr6q1v4/Ut
LQxfojUWiLQdg2ESJItkcuweYg+kc3HCyFejeDIBw9dpXt00rY26p05qrpnG+85b
hM1/PswpPLuBSr+oCIDj5GMC2r2iEKsfv2fJbNW8iWAXVLoWZRF8B0MfqX/YTMbm
ecorc4iXzQu7tupRihslbNkfvfciMnSDeSvzCpWAHl7h8Wj6hhqePmLm9lAYqnKp
8S5B/1SSQuEAjRZgI4IexpZoeKGVDptPHxLLS38fozsyi0QyDyzEgJxcJQVMXxVi
RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
=EFTF
-----END PGP SIGNATURE-----

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <kody@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2020 -0700

    changed the version number

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

三、验证标签

  • 要验证一个签署的标签,可以运行 git tag -v ,这个命令使用 GPG 来验证签名。为了验证能正常工作,签署者的公钥需要在我们的钥匙链中:
$ git tag -v v1.4.2.1
object 883653babd8ee7ea23e6a5c392bb739348b1eb61
type commit
tag v1.4.2.1
tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700

GIT 1.4.2.1

Minor fixes since 1.4.2, including git-mv and git-http with alternates.
gpg: Signature made Wed Sep 13 02:08:25 2020 PDT using DSA key ID F3119B9A
gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
gpg:                 aka "[jpeg image of size 1513]"
Primary key fingerprint: 3565 2A26 2040 E066 C9A7  4A7D C0C6 D9A4 F311 9B9A

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 如果没有签署者的公钥,那么将会得到类似下面的东西:
gpg: Signature made Wed Sep 13 02:08:25 2020 PDT using DSA key ID F3119B9A
gpg: Can't check signature: public key not found
error: could not verify the tag 'v1.4.2.1'

  
 
  • 1
  • 2
  • 3

四、签署提交

  • 在最新版本的 Git 中(v1.7.9 及以上),也可以签署个人提交。如果相对于标签而言,我们对直接签署到提交更感兴趣的话,所有要做的只是增加一个 -S 到 git commit 命令:
$ git commit -a -S -m 'signed commit'

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <kody@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2014-06-04

[master 5c3386c] signed commit
 4 files changed, 4 insertions(+), 24 deletions(-)
 rewrite Rakefile (100%)
 create mode 100644 lib/git.rb

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • git log 也有一个 --show-signature 选项来查看及验证这些签名:
$ git log --show-signature -1
commit 5c3386cf54bba0a33a32da706aa52bc0155503c2
gpg: Signature made Wed Jun  4 19:49:17 2020 PDT using RSA key ID 0A46826A
gpg: Good signature from "Scott Chacon (Git signing key) <kody@gmail.com>"
Author: Scott Chacon <kody@gmail.com>
Date:   Wed Jun 4 19:49:17 2014 -0700

    signed commit

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 另外,也可以配置 git log 来验证任何找到的签名并将它们以 %G? 格式列在输出中:
$ git log --pretty="format:%h %G? %aN  %s"

5c3386c G Scott Chacon  signed commit
ca82a6d N Scott Chacon  changed the version number
085bb3b N Scott Chacon  removed unnecessary test code
a11bef0 N Scott Chacon  first commit

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 这里可以看到只有最后一次提交是签署并有效的,而之前的提交都不是。在 Git 1.8.3 及以后的版本中,git merge 与 git pull 可以使用 --verify-signatures 选项来检查并拒绝没有携带可信 GPG 签名的提交。
  • 如果使用这个选项来合并一个包含未签名或有效的提交的分支时,合并不会生效。
$ git merge --verify-signatures non-verify
fatal: Commit ab06180 does not have a GPG signature.

  
 
  • 1
  • 2
  • 如果合并包含的只有有效的签名的提交,合并命令会提示所有的签名它已经检查过了然后会继续向前:
$ git merge --verify-signatures signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <kody@gmail.com>
Updating 5c3386c..13ad65e
Fast-forward
 README | 2 ++
 1 file changed, 2 insertions(+)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 也可以给 git merge 命令附加 -S 选项来签署自己生成的合并提交,如下所示,演示了验证将要合并的分支的每一个提交都是签名的并且签署最后生成的合并提交。
$ git merge --verify-signatures -S  signed-branch
Commit 13ad65e has a good GPG signature by Scott Chacon (Git signing key) <kody@gmail.com>

You need a passphrase to unlock the secret key for
user: "Scott Chacon (Git signing key) <kody@gmail.com>"
2048-bit RSA key, ID 0A46826A, created 2020-06-04

Merge made by the 'recursive' strategy.
 README | 2 ++
 1 file changed, 2 insertions(+)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/120383352

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。