我可以使用 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 上测试