如何通过 ssh-agent 转发 gpg 密钥?

txw*_*ger 37 ssh ssh-agent gnupg

我可以使用 ssh 配置文件启用转发添加到 ssh-agent 的 ssh 密钥。我怎样才能对 gpg 密钥做同样的事情?

Bri*_*ton 20

OpenSSH 的新 Unix Domain Socket Forwarding 可以从 6.7 版开始直接执行此操作。

您应该能够执行以下操作:

ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
Run Code Online (Sandbox Code Playgroud)

  • 我发现了一个必需的关键细节:在远程(无私钥)机器上,签名身份的 _public_ 密钥必须存在。本地 gpg 版本 2.1.15 OS X,远程 2.1.11 linux。 (3认同)
  • 似乎在 Ubuntu 18.04 上,systemd 拥有带有主机额外套接字的文件,并且 ssh 守护程序无法绑定到它(joutnalctl 告诉我地址​​已在使用中并且`错误:unix_listener:无法绑定到路径:/run/user/1001 /gnupg/S.gpg-agent.extra`)。这个答案仍然有效吗? (2认同)

b0f*_*0fh 18

编辑:这个答案已经过时了,因为 OpenSSH 中已经实现了适当的支持,请参阅 Brian Minton 的答案。

SSH 只能在隧道内转发 tcp 连接。

但是,您可以使用类似socat通过 TCP 中继 unix 套接字的程序,使用类似的程序(您将在客户端和服务器主机上都需要 socat):

# Get the path of gpg-agent socket:
GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1)

# Forward some local tcp socket to the agent
(while true; do
    socat TCP-LISTEN:12345,bind=127.0.0.1 UNIX-CONNECT:$GPG_SOCK;
done) &

# Connect to the remote host via ssh, forwarding the TCP port
ssh -R12345:localhost:12345 host.example.com

# (On the remote host)
(while true; do
    socat UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early TCP4:localhost:12345;
done) &
Run Code Online (Sandbox Code Playgroud)

测试它是否适用于gpg-connect-agent. 确保远程主机上的 GPG_AGENT_INFO 未定义,以便它回退到$HOME/.gnupg/S.gpg-agent套接字。

现在希望您所需要的只是一种自动运行所有这些的方法!


小智 11

在新版本的 GnuPG 或 Linux 发行版中,套接字的路径可以改变。这些可以通过

$ gpgconf --list-dirs agent-extra-socket
Run Code Online (Sandbox Code Playgroud)

$ gpgconf --list-dirs agent-socket
Run Code Online (Sandbox Code Playgroud)

然后将这些路径添加到您的 SSH 配置中:

Host remote
  RemoteForward <remote socket> <local socket>
Run Code Online (Sandbox Code Playgroud)

复制公钥的快速解决方案:

scp .gnupg/pubring.kbx remote:~/.gnupg/
Run Code Online (Sandbox Code Playgroud)

在远程机器上,激活 GPG 代理:

echo use-agent >> ~/.gnupg/gpg.conf
Run Code Online (Sandbox Code Playgroud)

在远程机器上,还要修改 SSH 服务器配置并添加此参数(/etc/ssh/sshd_config):

StreamLocalBindUnlink yes
Run Code Online (Sandbox Code Playgroud)

重新启动 SSH 服务器,重新连接到远程机器 - 然后它应该可以工作了。

  • 如果远程主机运行当前版本的 Debian,它似乎在运行 `systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-需要 agent-browser.socket` 来防止 systemd 启动套接字窃取远程 gpg-agent。根据 https://bugs.debian.org/850982,这是预期的行为。 (2认同)
  • 您可能需要阻止远程“gpg-agent”启动和删除转发的套接字。 gpg wiki 中也对此进行了描述。他们没有说的是如何做到这一点。远程计算机上的“echo no-autostart &gt;&gt; ~/.ssh/gpg-agent.conf”对我有用。 (2认同)