当 systemd 拥有远程套接字时,如何通过 ssh 使用 GPG 代理转发?

oar*_*ish 7 ssh gpg forwarding gpg-agent unix-sockets

我正在尝试遵循这些指南和答案

\n\n

以及我能找到的其他任何东西来完成这项工作:

\n
    \n
  • 从 macOS 到 ubuntu 18.04 的 SSH
  • \n
  • 转发我的本地 gpg 代理,以便我可以gpg --decrypt在远程计算机上。
  • \n
\n

我已经将我的公钥编辑到远程机器上--export--import远程 gpg 报告驻留在\n 中的代理套接字/run/user/1001/gnupg/S.gpg-agent,以及位于 中的额外套接字/run/user/1001/gnupg/S.gpg-agent.extra

\n

然而,试图ssh -v -R /run/user/1001/gnupg/S.gpg-agent:/Users/rasmus/.gnupg/S.gpg-agent.extra -l rasmus <remote-host>警告说

\n
\n

警告:侦听路径 /run/user/1001/gnupg/S.gpg-agent 的远程端口转发失败

\n
\n

这可能是因为 systemd 已经拥有远程套接字。

\n
$ sudo journalctl -xe\n\xe2\x80\xa6\nMar 11 15:06:21 pact-cube sshd[4972]: error: bind: Address already in use\nMar 11 15:06:21 pact-cube sshd[4972]: error: unix_listener: cannot bind to path: /run/user/1001/gnupg/S.gpg-agent\n
Run Code Online (Sandbox Code Playgroud)\n

我必须做什么才能将 gpg 代理从 macOS 转发到 Ubuntu 18.04?\n两台计算机上都使用所需的 GPG 和 SSH 版本。

\n

Rob*_*ade 1

删除过时的套接字文件:

\n
ssh mylinuxserver \'rm /run/user/1001/gnupg/S.gpg-agent\'\n
Run Code Online (Sandbox Code Playgroud)\n

然后连接:

\n
ssh -vvv mylinuxserver\n
Run Code Online (Sandbox Code Playgroud)\n

这假设您已经RemoteForward在您的~/.ssh/config. 它看起来像这样:

\n
# File: ~/.ssh/config\n[...]\nHost mylinuxserver\nHostName mylinuxserver.example.com \n#RemoteForward <socket_on_remote_box>  <extra_socket_on_local_box>\nRemoteForward /run/user/1001/gnupg/S.gpg-agent /Users/rasmus/.gnupg/S.gpg-agent.extra\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n

在详细输出中,您应该看到类似以下内容:

\n
debug1: remote forward success for: listen /run/user/1001/gnupg/S.gpg-agent:-2, \\\n   connect /Users/rasmus/.gnupg/S.gpg-agent.extra:-2\n
Run Code Online (Sandbox Code Playgroud)\n

然后在远程计算机上使用 gpg-agent 应该可以工作。

\n

为了避免每次都需要删除过时的套接字文件,请添加StreamLocalBindUnlink yes到服务器的/etc/ssh/sshd_config,如下所示:https: //wiki.gnupg.org/AgentForwarding

\n

给任何试图让它在 Fedora Linux 上工作的人注意:我需要在我的 Fedora Linux 工作站上启用两个套接字才能使套接字激活工作:

\n
systemctl --user enable gpg-agent.socket\nsystemctl --user enable gpg-agent-extra.socket\n
Run Code Online (Sandbox Code Playgroud)\n

然后报告gpg-agent.service说它将由这两个套接字按需触发:

\n
$ systemctl --user status gpg-agent.service\n\xe2\x97\x8b gpg-agent.service - GnuPG cryptographic agent and passphrase cache\n     Loaded: loaded (/usr/lib/systemd/user/gpg-agent.service; static)\n     Active: inactive (dead)\nTriggeredBy: \xe2\x97\x8f gpg-agent-extra.socket\n             \xe2\x97\x8f gpg-agent.socket\n       Docs: man:gpg-agent(1)\n
Run Code Online (Sandbox Code Playgroud)\n