我正在尝试遵循这些指南和答案
- https://wiki.gnupg.org/AgentForwarding
- https://superuser.com/questions/161973/how-can-i-forward-a-gpg-key-via-ssh-agent
- https://gist.github.com/TimJDFletcher/85fafd023c81aabfad57454111c1564d
以及我能找到的其他任何东西来完成这项工作:
- 从 macOS 到 ubuntu 18.04 的 SSH
- 转发我的本地 gpg 代理,以便我可以
gpg --decrypt
在远程计算机上。
我已经--export
将--import
我的公钥编辑到远程机器上。远程 gpg 报告驻留在 中的代理套接字
/run/user/1001/gnupg/S.gpg-agent
,以及位于 中的额外套接字/run/user/1001/gnupg/S.gpg-agent.extra
。
然而,试图ssh -v -R /run/user/1001/gnupg/S.gpg-agent:/Users/rasmus/.gnupg/S.gpg-agent.extra -l rasmus <remote-host>
警告说
警告:侦听路径 /run/user/1001/gnupg/S.gpg-agent 的远程端口转发失败
这可能是因为 systemd 已经拥有远程套接字。
$ sudo journalctl -xe
…
Mar 11 15:06:21 pact-cube sshd[4972]: error: bind: Address already in use
Mar 11 15:06:21 pact-cube sshd[4972]: error: unix_listener: cannot bind to path: /run/user/1001/gnupg/S.gpg-agent
我必须做什么才能将 gpg 代理从 macOS 转发到 Ubuntu 18.04?两台机器上都使用所需的 GPG 和 SSH 版本。
答案1
获得 gpg 转发功能的最简单方法是首先告诉 systemd 停止干扰这些套接字。通过在远程端执行以下命令,可以为当前用户完成此操作,无需 sudo 权限:
systemctl --user 'disable' 'gpg-agent.socket'
systemctl --user 'disable' 'gpg-agent-extra.socket'
systemctl --user 'stop' 'gpg-agent.socket'
systemctl --user 'stop' 'gpg-agent-extra.socket'
消除不必要的有问题的组件后,下一步就是确定需要放置插座的位置。通过跑步轻松完成gpgconf --list-dirs
。 (请注意,这些套接字目录是硬编码的,如中所示主目录.c。如果不修补 gnupg 并重新编译,就无法配置它们。)
所需要的只是将客户端套接字转发到服务器,并且由行为不当的第三方将其保留。可以通过运行以下命令生成 ssh 配置块:(update $remote)
remote='host.example.com'
local_sock=$( gpgconf --list-dirs | sed -n 's/agent-extra-socket://p' )
remote_sock=$( ssh $remote "gpgconf --list-dirs" | sed -n 's/agent-socket://p' )
echo "Host $remote\n RemoteForward $remote_sock $local_sock"
通常应该会产生类似于以下内容的结果:(数字 uid:s 肯定会有所不同)
Host host.example.com
RemoteForward /run/user/1/gnupg/S.gpg-agent /run/user/2/gnupg/S.gpg-agent.extra
即使 systemd 被驱逐,仍有另一位不速之客往往会出现在这些聚会上。即远程系统上的 ssh 代理。由于我们唯一希望拥有的是本地代理,因此应该杀死任何远程运行的代理以阻止它阻止套接字转发:
ssh $remote "pkill gpg-agent"
gpg
每次尝试在没有激活代理转发的情况下使用后,可能需要执行最后一步。除非更新 gpg:s 配置以在套接字不可用时退出并显示错误消息,而不是尝试启动一个永远不会被任何密钥信任的愚蠢的远程代理。可以通过以下方式完成:
ssh $remote "echo 'no-autostart' >> .gnupg/gpg.conf"
综上所述,ssh -v
应该说:远程转发成功...。
答案2
删除过时的套接字文件:
ssh mylinuxserver 'rm /run/user/1001/gnupg/S.gpg-agent'
然后连接:
ssh -vvv mylinuxserver
这假设您已经RemoteForward
在您的~/.ssh/config
.它看起来像这样:
# File: ~/.ssh/config
[...]
Host mylinuxserver
HostName mylinuxserver.example.com
#RemoteForward <socket_on_remote_box> <extra_socket_on_local_box>
RemoteForward /run/user/1001/gnupg/S.gpg-agent /Users/rasmus/.gnupg/S.gpg-agent.extra
[...]
在详细输出中,您应该看到类似以下内容:
debug1: remote forward success for: listen /run/user/1001/gnupg/S.gpg-agent:-2, \
connect /Users/rasmus/.gnupg/S.gpg-agent.extra:-2
然后在远程计算机上使用 gpg-agent 应该可以工作。
为了避免每次都需要删除过时的套接字文件,请添加StreamLocalBindUnlink yes
到服务器的/etc/ssh/sshd_config
,如下所示:https://wiki.gnupg.org/AgentForwarding
给任何试图让它在 Fedora Linux 上工作的人注意:我需要在我的 Fedora Linux 工作站上启用两个套接字才能使套接字激活工作:
systemctl --user enable gpg-agent.socket
systemctl --user enable gpg-agent-extra.socket
然后报告gpg-agent.service
说它将由这两个套接字按需触发:
$ systemctl --user status gpg-agent.service
○ gpg-agent.service - GnuPG cryptographic agent and passphrase cache
Loaded: loaded (/usr/lib/systemd/user/gpg-agent.service; static)
Active: inactive (dead)
TriggeredBy: ● gpg-agent-extra.socket
● gpg-agent.socket
Docs: man:gpg-agent(1)