在 zsh 中为 git 使用 GPG 签名遇到的问题

最近在 git 提交某些关键代码时就在想着要是别人冒充我的名义提交了代码怎么办,于是就折腾起 git commit 的签名。

首先安装 PGPbrew install gpg

然后用 PGP 创建主密钥并为 git 单独创建一个子密钥。

然后通过 git config --global user.signingkey {用户签名的子密钥的标识}git config --global commit.gpgsign true 或者编辑 ~/.gitconfig 配置 git 在提交时使用指定子密钥进行自动签名:

# ~/.gitconfig

...

[user]
	name = xxx
	email = xxx@xxx.com # 注意 这里必须与创建密钥时使用的邮箱一致
	signiningkey = XXXX # 使用哪个子密钥进行签名
[commit]
	gpgsign = true # 提交时自动签名
	
...

注意: 这里的 user.email 必须与创建 GPG 密钥时的邮箱一致,否则 git 自动签名时会发生错误(是的,我忽略了这里折腾了很久)。

按理说到这里就差不多了,但在提交时却遇到了错误:

git commit -m “test” error: gpg failed to sign the data
fatal: failed to write commit object

于是尝试使用 gpg --clearsign ./read.md 进行签名,发现也错误,但错误信息变了:

gpg: agent_genkey failed: No such file or directory
Key generation failed: No such file or directory

网上搜索一番,貌似因为使用了 Powerlevel10kInstant prompt 功能导致 git 无法弹出密码输入框导致的(我设置了密钥的密码)。

解决方案:
zshGPG_TTY=$TTY 增加到 ~/.zshrc 中;
bashexport GPG_TTY=$(tty) 加入到 ~/.bash_profile
fishset -x GPG_TTY (tty) 加入到 ~/.config/fish/config.fish

将导入的私钥的信任问题

将私钥导入另一台机器后,使用 gpg --list-secret-keys --keyid-format=long 列出私钥时发现 uid 后显示的状态是 [unknown]

解决方法:

gpg --edit-key user@useremail.com

gpg> trust

Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

  1 = I don't know or won't say
  2 = I do NOT trust
  3 = I trust marginally
  4 = I trust fully
  5 = I trust ultimately
  m = back to the main menu

Your decision? 5

gpg> save