让远程服务器使用本地 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
重新登录到远程机器上,此时可以正常使用本地的私钥