Skip to main content

让远程服务器使用本地 GPG 私钥

原理: 通过 ssh,将本地的 S.gpg-agent.extra socket 转发到远程的 S.gpg-agent socket

远程机器的配置

  1. 导入公钥
  2. 运行 gpgconf --list-dirs agent-socket 查看 agent socket 路径,较新版本的 systemd 用户会是 /run/user/[your_remote_uid]/gnupg/S.gpg-agent
  3. /etc/ssh/sshd_config 添加 StreamLocalBindUnlink yes, 并重启 sshd service

本地机器的配置

  1. 运行 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
    
  2. ~/.gnupg/gpg-agent.conf 添加 extra-socket /run/user/[your_local_uid]/gnupg/S.gpg-agent.extra
  3. ~/.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:

  1. 断开所有到远程机器的 ssh 连接
  2. 注释 ~/.ssh/configRemoteForward 这一行,然后在远程机器上重启 gpg-agent.socket 并退出
    systemctl --user restart gpg-agent.socket
    
  3. 取消注释 ~/.ssh/configRemoteForward

重新登录到远程机器上,此时可以正常使用本地的私钥

资料

  1. https://wiki.gentoo.org/wiki/GnuPG#Forwarding_GPG_Agent_over_SSH
  2. https://rabbithole.wwwdotorg.org/2021/03/03/gpg-agent-fwding-over-ssh.html