让远程服务器使用本地 GPG 私钥
原理: 通过 ssh,将本地的 S.gpg-agent.extra socket 转发到远程的 S.gpg-agent socket
远程机器的配置
- 导入公钥
- 运行
gpgconf --list-dirs agent-socket查看 agent socket 路径,较新版本的 systemd 用户会是/run/user/[your_remote_uid]/gnupg/S.gpg-agent - 在
/etc/ssh/sshd_config添加StreamLocalBindUnlink yes, 并重启 sshd service
本地机器的配置
- 运行
gpgconf --list-dirs agent-extra-socket查看 agent extra socket 路径,我这里是/run/user/[your_local_uid]/gnupg/S.gpg-agent.extra。 如果没有显示需要手动启动systemctl --user enable --now gpg-agent-extra.socket - 在
~/.gnupg/gpg-agent.conf添加extra-socket /run/user/[your_local_uid]/gnupg/S.gpg-agent.extra - 在
~/.ssh/config为对应的 Host 添加 forward socket,示例如下
Host remote-server
HostName remote-server.com
User root
RemoteForward /run/user/[your_remote_uid]/gnupg/S.gpg-agent:/run/user/[your_local_uid]/gnupg/S.gpg-agent.extra
测试
在远程机器上运行 gpg --list-secret-keys 可以看到你的私钥,此时我们就配置成功了。
常见错误
很多时候重新登录后会发现 gpg --list-secret-keys 并不能看到你的私钥,可以尝试重启远程机器上的 gpg-agent.socket:
- 断开所有到远程机器的 ssh 连接
- 注释
~/.ssh/config中RemoteForward这一行,然后在远程机器上重启 gpg-agent.socket 并退出systemctl --user restart gpg-agent.socket - 取消注释
~/.ssh/config中RemoteForward
重新登录到远程机器上,此时可以正常使用本地的私钥