使用 GPG 签名 Git Commit

发布时间: 更新时间: 总字数:1815 阅读时间:4m 作者: 分享 复制网址
专栏文章
  1. Git 专题介绍
  2. Gitops 介绍
  3. Git 常用命令
  4. Duplicating a git repository
  5. 图解4种git合并分支方法
  6. Git stash简介
  7. 使用 GPG 签名 Git Commit(当前)
  8. Git LFS 使用
  9. Git 仓库瘦身
  10. git hook 之 pre-commit 代码检查使用介绍
  11. Git 创建空的远程/本地分支
  12. Git submodule 使用介绍

GPG 是一种加密算法,github 提交时支持使用 GPG 加密(或称签名),来保证你的 commit 在传输的过程中没有被篡改。下面结合 keybase 介绍如何使用 GPG

什么是 GPG

Working with GPG Signatures

要求

Git client 版本高于 2.0。

安装GPG

brew install gpg
或
brew cask install keybase

使用

我们可以自己生成 GPG key 并使用,也可以采用keybase生成的key。

GPG key

生成 GPG key

gpg --gen-key

具体步骤如下:

~ xiexianbin$ gpg --gen-key
gpg (GnuPG) 2.2.15; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注意:使用 “gpg --full-generate-key” 以获得一个功能完整的密钥产生对话框。

GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: xiexianbin
电子邮件地址: me@xiexianbin.cn
您选定了此用户标识:
    “xiexianbin <me@xiexianbin.cn>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 密钥 8284896418BCC645 被标记为绝对信任
gpg: 目录‘/Users/xiexianbin/.gnupg/openpgp-revocs.d’已创建
gpg: 吊销证书已被存储为‘/Users/xiexianbin/.gnupg/openpgp-revocs.d/11518af49eaa27d86ea01b5c901487ea218aeb1a.rev’
公钥和私钥已经生成并被签名。

pub   rsa2048 2019-05-16 [SC] [有效至:2021-05-15]
      11518af49eaa27d86ea01b5c901487ea218aeb1a
uid                      xiexianbin <me@xiexianbin.cn>
sub   rsa2048 2019-05-16 [E] [有效至:2021-05-15]

注意:邮箱是github认证的邮箱

查看GPG key

gpg --list-keys
gpg --list-secret-keys

示例:

~ xiexianbin$ gpg --list-keys
/Users/xiexianbin/.gnupg/pubring.kbx
------------------------------------
pub   rsa2048 2019-05-16 [SC] [有效至:2021-05-15]
      11518af49eaa27d86ea01b5c901487ea218aeb1a
uid           [ 绝对 ] xiexianbin <me@xiexianbin.cn>
sub   rsa2048 2019-05-16 [E] [有效至:2021-05-15]

~ xiexianbin$

注意:

  • pub:公钥
  • sub:私钥
  • 11518af49eaa27d86ea01b5c901487ea218aeb1apub GPG key ID

导出公钥

gpg --armor --export <pub GPG key ID>

示例:

~ xiexianbin$ gpg --armor --export 11518af49eaa27d86ea01b5c901487ea218aeb1a
-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----

GPG key 格式:

-----BEGIN PGP PUBLIC KEY BLOCK-----
...
-----END PGP PUBLIC KEY BLOCK-----

删除GPG key

gpg --delete-keys <pub GPG key ID>
gpg --delete-secret-keys <pub GPG key ID>

Keybase

全新生成

➜  ~ keybase pgp gen --multi
Enter your real name, which will be publicly visible in your new key: xiexianbin
Enter a public email address for your key: me@xiexianbin.cn
Enter another email address (or <enter> when done):
Push an encrypted copy of your new secret key to the Keybase.io server? [Y/n] Y
When exporting to the GnuPG keychain, encrypt private keys with a passphrase? [Y/n] Y
▶ INFO PGP User ID: xiexianbin <me@xiexianbin.cn> [primary]
▶ INFO Generating primary key (4096 bits)
▶ INFO Generating encryption subkey (4096 bits)
▶ INFO Generated new PGP key:
▶ INFO   user: xiexianbin <me@xiexianbin.cn>
▶ INFO   4096-bit RSA key, ID 901487EA218AEB1A, created 2019-05-25
▶ INFO Exported new key to the local GPG keychain
➜  ~ gpg --list-keys
/Users/xiexianbin/.gnupg/pubring.kbx
------------------------------------
pub   rsa4096 2019-05-25 [SC] [有效至:2035-05-21]
      11518AF49EAA27D86EA01B5C901487EA218AEB1A
uid           [ 未知 ] xiexianbin <me@xiexianbin.cn>
sub   rsa4096 2019-05-25 [E] [有效至:2035-05-21]

➜  ~ gpg --list-secret-keys
/Users/xiexianbin/.gnupg/pubring.kbx
------------------------------------
sec   rsa4096 2019-05-25 [SC] [有效至:2035-05-21]
      11518AF49EAA27D86EA01B5C901487EA218AEB1A
uid           [ 未知 ] xiexianbin <me@xiexianbin.cn>
ssb   rsa4096 2019-05-25 [E] [有效至:2035-05-21]

➜  ~

获取 PGP Public key

curl https://keybase.io/xiexianbin/pgp_keys.asc | gpg --import
或
keybase pgp export -q 11518af49eaa27d86ea01b5c901487ea218aeb1a | gpg --import

导出公钥,并配置 git GPG key:

gpg --armor --export <pub GPG key ID>

获取 PGP Private key

keybase pgp export -q 11518af49eaa27d86ea01b5c901487ea218aeb1a --secret | gpg --allow-secret-key-import --import

Github 配置 GPG

配置 GPG 公钥到仓库

Github Setting -> SSH and GPG keys -> New GPG Key 导入即可

本地代码仓库启用GPG Sign

通过gpg --list-keys查看pub GPG key ID,后设置git签名时用的key

全局设置

# 配置已经生成的GPG Key ID
git config --global user.signingkey <pub GPG key ID>
# 配置启用GPG签名
git config --global commit.gpgsign true

指定仓库设置,需要进入代码目录:

# 配置已经生成的GPG Key ID
git config --local user.signingkey <pub GPG key ID>
# 配置启用GPG签名
git config --local commit.gpgsign true

重启 gpg-agent

第一次配置,必须重启,否则签名会失败,命令如下:

gpgconf –kill gpg-agent

上述步骤示例

~ xiexianbin$ git config --global user.signingkey 11518af49eaa27d86ea01b5c901487ea218aeb1a
~ xiexianbin$ git config --global commit.gpgsign true
~ xiexianbin$ gpgconf –kill gpg-agent
gpg:OpenPGP:/usr/local/Cellar/gnupg/2.2.15/bin/gpg
gpg-agent:私钥:/usr/local/Cellar/gnupg/2.2.15/bin/gpg-agent
scdaemon:智能卡:/usr/local/Cellar/gnupg/2.2.15/libexec/scdaemon
gpgsm:S/MIME:/usr/local/Cellar/gnupg/2.2.15/bin/gpgsm
dirmngr:网络:/usr/local/Cellar/gnupg/2.2.15/bin/dirmngr
pinentry:密码条目:/usr/local/opt/pinentry/bin/pinentry
~ xiexianbin$

关闭GPG签名

所有仓库:

git config --global commit.gpgsign false
git config --global --unset commit.gpgsign

本地仓库:

git config --local commit.gpgsign false
git config --local --unset commit.gpgsign

git 使用

提交

git commit -am "feature: something"
git push origin develop

然后我们可以在 git 中看到 Verified 的标识。

如果不设置git config --global commit.gpgsign true,提交的时候加上一个 -S 参数就可以为提交签名:

git commit -S -m `your commit message`

查看日志

git log --show-signature -1

错误

错误一

$ GIT_TRACE=1 git commit -m "xxx"
22:03:55.417251 git.c:455               trace: built-in: git commit -m 'feature: jwt support'
22:03:55.424110 run-command.c:667       trace: run_command: gpg --status-fd=2 -bsau B5A1B728A2FD170FE0E6C4E2D6B71988603A67D2
error: gpg failed to sign the data
fatal: failed to write commit object
或
error: gpg 无法为数据签名
fatal: 写提交对象失败
  • 解决方法
echo export GPG_TTY=$(tty) >> ~/.bash_profile

如果没有解决,执行如下命令:

$ gpg --status-fd=2 -bsau B5A1B728A2FD170FE0E6C4E2D6B71988603A67D2

# 如果卡住,执行
killall gpg-agent

导出keybase security错误

keybase pgp export -q <my-keybase-key-id> -s
▶ ERROR No matching keys found

keybase 服务没有保存私钥。

参考

  1. https://help.github.com/articles/generating-a-gpg-key/
  2. https://en.wikipedia.org/wiki/Pretty_Good_Privacy
  3. https://help.github.com/en/articles/telling-git-about-your-signing-key
  4. https://help.github.com/en/articles/adding-a-new-gpg-key-to-your-github-account
  5. https://github.com/longtian/gpg-howto
  6. Set up Keybase.io, GPG & Git to sign commits on GitHub
  7. Keybase 命令行使用
专栏文章
  1. Git 专题介绍
  2. Gitops 介绍
  3. Git 常用命令
  4. Duplicating a git repository
  5. 图解4种git合并分支方法
  6. Git stash简介
  7. 使用 GPG 签名 Git Commit(当前)
  8. Git LFS 使用
  9. Git 仓库瘦身
  10. git hook 之 pre-commit 代码检查使用介绍
  11. Git 创建空的远程/本地分支
  12. Git submodule 使用介绍
最新评论
加载中...
Home Archives Categories Tags Statistics