在macOS 11.1下测试通过。

  • gpg (GnuPG) 2.2.25
  • libgcrypt 1.8.7
  • pinentry-mac (pinentry) 0.9.4

安装所需软件

brew install gpg2 gnupg pinentry-mac

创建钥匙对

gpg --full-generate-key

这里建议使用--full-generate-key选项自定义全部选项,按照提示输入即可,加密方法选(1) RSA and RSA (default),密钥长度可选择最长4096

其中邮箱地址需要与Github中验证通过的邮箱保持一致。

设置终端环境变量

export GPG_TTY=$(tty)

在这一步,设置GPG终端类型环境变量,目的是让GPG程序知道使用什么作为终端,并使其生效:

source ~/.zshrc # 如果使用的是bash,更改为.bashrc

配置GPG代理

vim ~/.gnupg/gpg-agent.conf

将以下内容追加进入配置文件

pinentry-program /usr/local/bin/pinentry-mac

这样,就可以使用pinentry管理GPG密钥了。

载入GPG代理配置

gpgconf --kill gpg-agent

通过杀死gpg-agent,确保配置文件被加载。

测试一下

echo "test" | gpg --clearsign

运行以上命令,对字符串test进行签名以测试gpg是否配置成功。

如果配置成功,应该会出现pinentry的窗口,选择Save in keychain可以将密码保存至钥匙链。

正确输入密码后,可以看到信息和签名。

获取密钥ID

gpg -K --keyid-format SHORT

执行成功应该会出现这样的内容:

-------------------------------------
sec   rsa4096/<Key ID Short> 2020-12-27 [SC] [expires: 2024-12-26]
      <Key ID>
uid         [ultimate] example <example@example.com>

使用Key ID ShortKey ID均可。

在Git中设置密钥

git config --global user.signingkey <Key ID>

通过以上命令可以在全局设置中配置密钥ID。

开启强制签名

通过以上步骤就可以实现GPG签名commit了,只需要添加-S选项即可,如下:

git commit -S -m "这是一条签名过的commit"

但是为了方便,我们可以通过全局设置来强制开启GPG

git config --global commit.gpgsign true
git config --global tag.forceSignAnnotated true

其中第一个参数是默认开启签名,第二个参数是强制开启签名。


后记

在最初的配置过程完成后,我对我的一个仓库进行commit操作出现错误,如下:

error: gpg failed to sign the data 
fatal: failed to write commit object

通过加入GIT_TRACE=1 参数观察Git的执行过程,我发现其卡死在了这个命令的执行上:

gpg --status-fd=2 -bsau <Key ID>

具体是什么原因我并未做深究。


参考

Last modification:December 27, 2020
博客维护不易,如果你觉得我的文章有用,请随意赞赏