gpg and agent in Mac and Arch

一直以来我都被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
2
# gpg-agent.conf
pinentry-program /opt/homebrew/bin/pinentry-mac

而 archlinux 上也需要改 .gnupg 的文件:

1
2
# gpg.conf
use-agent

二者都需要在 .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来解决问题。