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

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

我可以使用 ssh 配置文件来启用添加到 ssh-agent 的 ssh 密钥的转发。我如何对 gpg 密钥执行相同操作?

答案1

编辑:现在 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) &

测试它是否能正常工作gpg-connect-agent。确保 GPG_AGENT_INFO 在远程主机上未定义,以便它返回到套接字$HOME/.gnupg/S.gpg-agent

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

答案2

OpenSSH 的新 Unix 域套接字转发从 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

答案3

在新版本的 GnuPG 或 Linux 发行版中,套接字的路径可能会发生变化。可以通过以下方式找到这些路径

$ gpgconf --list-dirs agent-extra-socket

$ gpgconf --list-dirs agent-socket

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

Host remote
  RemoteForward <remote socket> <local socket>

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

scp .gnupg/pubring.kbx remote:~/.gnupg/

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

echo use-agent >> ~/.gnupg/gpg.conf

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

StreamLocalBindUnlink yes

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

答案4

/etc/ssh/sshd_config作为使用进行修改的替代方法StreamLocalBindUnlink yes,您可以阻止创建需要替换的套接字文件:

systemctl --global mask --now \
  gpg-agent.service \
  gpg-agent.socket \
  gpg-agent-ssh.socket \
  gpg-agent-extra.socket \
  gpg-agent-browser.socket

请注意,这会影响全部主机上的用户。

奖励:如何测试 GPG 代理转发是否正常工作:

  • 当地的:ssh -v -o RemoteForward=${remote_sock}:${local_sock} ${REMOTE}
  • 检查${remote_sock}ssh 的详细输出中是否显示
  • 偏僻的:ls -l ${remote_sock}
  • 偏僻的:gpg --list-secret-keys
    • 你应该会看到很多debug1来自 ssh 的消息,显示转发的流量

如果这不起作用(对我来说不起作用)你可以跟踪 GPG 正在访问哪个套接字:

strace -econnect gpg --list-secret-keys

示例输出:

connect(5, {sa_family=AF_UNIX, sun_path="/run/user/14781/gnupg/S.gpg-agent"}, 35) = 0

就我而言,访问的路径完全匹配${remote_sock}尽管已将套接字添加到我的,但该套接字并未在sshd我登录时创建。我是在登录时由 systemd 创建的。StreamLocalBindUnlink yes/etc/ssh/sshd_config

(注意,我太胆小了,不敢重新开始sshd,因为我现在无法物理访问主机。service reload sshd显然不够......)

在 Ubuntu 16.04 上测试

相关内容