最近在提交 vue-devui 组件库 pr 时,被要求添加 gpg 签名。之前对这部分没有任何了解,正好了解一下,顺便写一下关于配置 gpg 需要注意的东西和配置的完整步骤。

安装 gpg

1
brew install gpg

确认是否安装成功:输入gpg -h 后,没有报错并有 gpg 相关的帮助文档的话就安装成功了。

生成 gpg 密钥

  1. 输入生成 gpg 密钥对的命令
1
gpg --full-generate-key
  1. 提示要生成的加密类型,或者直接 enter 默认
  2. 提示要生成的密钥大小,直接 enter 默认
  3. 输入密钥的有效时常,直接 enter 默认(不会过期)
  4. 验证是否输入正确,确认之前输入的是否是自己想要的,如果是就确认
  5. 输入用户信息:按照提示输入真实姓名、邮箱(和 GitHub 绑定的邮箱)
  6. 提示输入密码:在查看生成的公钥会用到
  7. 命令行输入 gpg --list-secret-keys --keyid-format=long,展示所有生成的 gpg 密钥
  8. 获取要上传至 GitHub 的密钥 id: sec rsa3072/xxx 中的 xxx 就是对应的密钥 id
1
2
3
4
sec   rsa3072/xxx 2023-01-16 [SC]
xxx
uid [ 绝对 ] xxx (github use) <xxx@xx.com>
ssb rsa3072/xxx 2023-01-16 [E]
  1. 输入 gpg --armor --export 3AA5C34371567BD2 查看生成的公钥

  2. 复制以 -----BEGIN PGP PUBLIC KEY BLOCK----- 开头并以 -----END PGP PUBLIC KEY BLOCK----- 结尾的 GPG 密钥。

    注意: 一定要将打印出的所有内容都粘贴,包括 -----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK-----。不然添加会失败

  3. 在 GitHub 中添加

添加 git 处理

配置让 git 使用 gpg 进行签名

1
git config --global user.signingkey <密钥ID>

设置 git 全局使用该密钥加密 commit

1
git config --global commit.gpgsign true

设置 git 全局使用该密钥进行加密 tag

1
git config --global tag.forcesignannotated true

报错处理

报错gpg failed to sign the data

使用 zsh 需要添加export GPG_TTY=$(tty)

  1. sudo vi ~/.zshrc

  2. 添加配置

1
export GPG_TTY=$(tty)
  1. 重新加载 zsh 配置文件 source ~/.zshrc

提交时一直报错

如果您之前设置了 pinentry 和 gpg,但它突然停止工作:
检查您的 gpg 是否有效:

1
echo "test" | gpg --clearsign

如果它说gpg: signing failed: No pinentry,只需重新启动 gpg 守护程序客户端,它会不时卡住:

1
gpgconf --kill gpg-agent

现在它应该可以工作了:

可以运行echo "test" | gpg --clearsign 先,会提示输入密码,输入密码后再次进行代码提交就 ok 了。


实在不行就使用 git config --global commit.gpgsign false && git config --global tag.forcesignannotated false 直接关闭全局 gpg 加密