在Windows上使用GPG4Win的坑
众所周知大D组了All in Bomb,自然也要搭一个Gitea在上面。
由于会使用GPG来进行Git操作签名,将密钥添加到Gitea内也是属于正常操作了。
但在Windows上有个坑,简单记录一下。
现象
这个坑的现象如下:
-
- 在Powershell中,使用
gpg --full-generate-key
生成自签发密钥后在Gitea内添加后,进行验证时失败。 - 在Powershell中,直接使用
echo "test" | gpg --sign
会提示gpg: skipped "xxxxxxxxxxxxxxxx": No secret key
- 添加正常后,在Powershell中,
git commit
时会提示gpg: skipped "xxxxxxxxxxxxxxxx": No secret key
或者Error: “signing failed: No secret key”
- 在Powershell中,使用
解决方法
第一个问题
针对第一个问题,可能是由于命令提示符/终端输出密文时有问题,导致加入Gitea的和实际存储的是不一致的,所以验证会一直失败。
可以选择使用Kleopatra GUI,查看需要加入Gitea的密钥的细节,导出证书即可查看到证书密文。
进行验证时,也使用Kleopatra GUI,将Gitea的验证字符串复制到剪贴板(只复制文本框里的字符串,不要复制包含gpg的命令),然后使用OpenGPG签名,选择好证书,输入密码,完成后的密文就在剪贴板上,直接去Gitea粘贴即可。
另外,Gitea和Github均对GPG的加密方式支持有限,高版本的GPG4Win默认的加密方式可能不被支持,所以在生成证书时,可以选择RSA方式。
第二、三个问题
在Powershell内执行gpg --list-secret-keys --keyid-format=long
,正常情况下应如下图所示:
有可能出现只有一个pubring.kbx
的情况,这时使用的文件均在用户目录的.gnupg
下,尝试删除这个目录看看。
如果是git commit
时报错,可以使用下方命令尝试将GPG4Win添加到.gitconfig
内然后再试。
1 |
git config --global gpg.program "c:\Program Files (x86)\GnuPG\bin\gpg.exe" |
外传
在WSL1/2上使用会遇到因为无法弹出密码输入框而报错的问题,WSL1和2要分开来解决。
WSL1的解决方法
WSL1可以通过重定向TTY来解决。
在.bashrc
或者.zshrc
(取决于使用bash还是使用zsh)中添加:export GPG_TTY=$(tty)
重启终端生效后即可正常显示密码输入框,但在VSCode中远程连接到WSL1时,仍然无法弹出输入框,这时可以使用VSCode的“GPG Indicator ”插件配合调高密钥缓存时间来变相解决。
WSL2的解决方法
在WSL2上解决就简单些,直接指定使用Windows上的GPG程序就可以了。
编辑GPG的config文件:
1 |
vim $HOME/.gnupg/gpg-agent.conf |
添加:
1 |
pinentry-program /mnt/c/Program Files (x86)/Gpg4win/bin/pinentry.exe |
即可解决。