一直以来我都被macos gpg-agent forward 到 archlinux 的不稳定而苦恼。即使是这篇文章也不一定是完美的解决方案,不过目前来看是能够运行的。
1. 背景配置
mac上我没有使用 gpgtool,因为它的 gpg 版本太低了。我使用的是 brew 安装的 gpg 以及输入密码用的 pinentry-mac。一定要安装 pinentry-mac, 这样才能把密码保存到 Keychain,以便日后无密码解锁 private key。
安装完之后,参考 use Apple Keychain to store GPG Passphrases配置 .gnupg 下的文件:
1 | # gpg-agent.conf |
而 archlinux 上也需要改 .gnupg 的文件:
1 | # gpg.conf |
二者都需要在 .zshrc 中配置 GPG_TTY:
1 | export GPG_TTY=$(tty) |
还需要根据官方教程 配置 .ssh/config 以及 /etc/ssh/sshd_config。
此外我还把 archlinux 的 gpg-agent.socket 给 mask 了:
1 | systemctl --user mask gpg-agent.socket |
2. export and import public key
根据另一个教程GnuPG agent forwarding的说法,需要把public key上传到remote并导入。在 mac 上导出 public key:
1 | gpg --output public.pgp --armor --export <gpg key fingerprint> |
复制到 archlinux 之后 import:
1 | gpg --import ./public.pgp |
3. 执行一次加解密来保存密码
在 macos 上执行一次 gpg 来把密码保存到 keychain:
1 | echo test | gpg -e -r <你的gpg key对应的邮箱> | gpg -d |
会弹出来一个输入密码的框,勾选上保存到keychain。
4. remote
同样执行 echo test | gpg -e -r <你的gpg key对应的邮箱> | gpg -d,此时应该会问你是否要继续,但不是提示输入密码;因为虽然 agent forward 过去了,但是 key 的信任等级没有配置,还是 unknown。直接确认 y,应该能够加解密成功。
要更改信任等级的话 gpg --edit-key <gpg private key fingerprint> 然后 trust 输入等级。
5. 如果提示没有private key
有时候可能由于意外掉线之类的导致remote的socket文件残留,导致通讯失败。此时可以删除remote上的socket并重新ssh来解决问题。