如何从CLI输入gnupg-agent密钥口令并缓存以解决Git签名问题?
针对你在fish shell下的场景,我们可以通过预设GPG密钥口令到gpg-agent并确保GUI工具能访问到agent的方式来解决。以下是详细步骤:
1. 确认gpg-agent基础配置
首先,确保你的fish配置文件(~/.config/fish/config.fish)已经正确设置了gpg-agent相关变量,并且启用了预设口令功能:
set -x GPG_TTY (tty) # 启动gpg-agent,允许预设口令,设置默认缓存时间为12小时(43200秒) eval (gpg-agent --daemon --allow-preset-passphrase --default-cache-ttl 43200)
同时,建议在~/.gnupg/gpg-agent.conf中添加永久配置(避免每次启动agent都重复加参数):
allow-preset-passphrase default-cache-ttl 43200 max-cache-ttl 86400 # 可选,设置最大缓存时间为24小时
2. 获取你的GPG密钥Keygrip
gpg-preset-passphrase工具需要使用密钥的Keygrip来定位目标密钥,运行以下命令获取:
gpg --list-secret-keys --with-keygrip
在输出中找到你用于提交签名的主密钥(sec开头的行),复制对应的Keygrip值,示例输出如下:
sec rsa4096 2023-01-01 [SC]
ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890ABCDEF
Keygrip = 1234567890ABCDEF1234567890ABCDEF12345678
3. 预设口令到gpg-agent
首先确认gpg-preset-passphrase工具的安装路径,运行:
which gpg-preset-passphrase
通常路径为/usr/libexec/gpg-preset-passphrase或/usr/lib/gpg-preset-passphrase。
然后使用该工具预设口令(替换成你自己的Keygrip):
# 安全方式:工具会提示你输入口令,避免明文暴露 /usr/libexec/gpg-preset-passphrase --preset 1234567890ABCDEF1234567890ABCDEF12345678
输入你的GPG密钥口令后,gpg-agent就会缓存这个口令,有效期为你设置的12小时。
4. 确保GUI工具能访问gpg-agent
如果你从终端启动VSCode,环境变量会自动继承,无需额外设置。但如果是从桌面启动VSCode,需要确保GPG_AGENT_INFO环境变量被全局继承:
- 对于X11桌面,在
~/.xprofile中添加:eval $(gpg-agent --daemon --allow-preset-passphrase --default-cache-ttl 43200) - 对于Wayland桌面,在
~/.config/wayland-session或对应桌面的启动配置文件中添加上述命令。
完成以上步骤后,你在VSCode等GUI工具中提交代码时,就可以直接使用已缓存的GPG密钥签名,无需再次输入口令了。
内容的提问来源于stack exchange,提问作者holms

