我在本地系统上使用 yubikey nano 在远程系统上进行加密/解密/签名,以及 SSH 代理转发。我记得这是一个熊设置,但它已经完美运行了几个月。突然断了。我的搜索都返回了我在设置时阅读的相同链接,但我被卡住了。
SSH 代理转发莫名其妙地起作用。远程系统显示:
REMOTE:$ ssh-add -L
ssh-rsa blahblah cardno:123
我可以使用 SSH 从远程系统登录到其他服务器,它使用 nano 进行身份验证(我知道这一点,因为它需要触摸才能启用代理签名)。我可以在本地系统的 gpg-agent 日志中看到有关 SSH 签名的日志。
但是,我根本无法让 GPG 签名/加密工作。如果我在远程系统上运行以下命令:
REMOTE:$ echo "$(uname -a)" | gpg2 --armor --clearsign --default-key 0x1234
gpg: all values passed to '--default-key' ignored
gpg: no default secret key: No secret key
gpg: [stdin]: clearsign failed: No secret key
在本地 gpg-agent 日志中,我没有看到有关该尝试的日志。如果我运行这个命令,我可以在本地 gpg-agent 日志中看到日志条目:
REMOTE:$ $ netcat -U /home/user/.gnupg/S.gpg-agent
OK Pleased to meet you
RESET
OK
GETINFO PID
ERR 67109115 Forbidden <GPG Agent>
POOP
ERR 67109139 Unknown IPC command <GPG Agent>
这会导致本地代理中的这些日志:
2018-01-05 16:38:32 gpg-agent[865] DBG: chan_10 -> OK Pleased to meet you
2018-01-05 16:38:35 gpg-agent[865] DBG: chan_10 <- RESET
2018-01-05 16:38:35 gpg-agent[865] DBG: chan_10 -> OK
2018-01-05 16:38:45 gpg-agent[865] DBG: chan_10 <- GETINFO PID
2018-01-05 16:38:45 gpg-agent[865] DBG: chan_10 -> ERR 67109115 Forbidden <GPG Agent>
2018-01-05 16:39:01 gpg-agent[865] DBG: chan_10 <- POOP
2018-01-05 16:39:01 gpg-agent[865] DBG: chan_10 -> ERR 67109139 Unknown IPC command <GPG Agent>
如果我在远程系统上的 gpg-connect-agent 上运行 strace -f -F,它似乎连接到 /var/run 中的一个套接字,而不是从 ~/.gnupg/ 中的本地系统转发的那个。我尝试删除两个套接字,杀死所有 gpg-agent 进程并将 SSH 远程转发更改为转到 /var/run 位置或 ~/.gnupg 位置,但无济于事。有可能我把这些步骤搞砸了,我会再试一次,但我想知道是否有人知道答案,我想在下次遇到这种情况时有一个容易找到的帖子。
本地系统:
Mac OS X 10.11.6
gpg installed with brew
gpg (GnuPG) 2.2.1
libgcrypt 1.8.1
远程系统:
ubuntu 17.10
gpg (GnuPG) 2.1.15
libgcrypt 1.7.8
编辑:好的,不知道发生了什么变化,但我将它单独放置了一会儿,然后回来尝试再次切换插座,它现在可以工作了:
REMOTE:$ $ echo "$(uname -a)" | strace -f -F gpg2 --armor --clearsign --default-key 0x1234
...
a bunch of garbage
...
stat("/run/user/1000/gnupg/S.gpg-agent", {st_mode=S_IFSOCK|0600, st_size=0, ...}) = 0
socket(AF_UNIX, SOCK_STREAM, 0) = 5
将我的 SSH 远程转发到这个新位置有效。我发誓我之前尝试过使用 gpgconf --list-dir agent-ssh-socket 提供的套接字路径,但没有任何运气。可能是忘了杀死现有的特工。碰巧,我偶然看到一篇博文报告说这种情况发生了变化: https ://blog.kylemanna.com/linux/gpg-213-ssh-agent-socket-moved/
这里显然存在一个间歇性错误,或者这是所有这些系统如何相互作用的副作用。我不想涉及太多细节/猜想,但我会考虑以下几点:
一个很好的解决方法是在 .ssh/config 中使用单独的特殊主机进行 gpg 代理转发,并确保只使用一次登录到该主机名!
它发生的几次非常令人沮丧,因为管道/运行代理和新 sshd 会话没有创建新套接字的实例的组合导致了各种混乱(再次可能是由于旧的套接字文件被正在运行的代理保持打开) )。通常,我没有时间尝试解决这样的问题。
终于在我能够排除故障和修复的位置遇到了这个问题,我可以可靠地重现问题并展示如何解决它:
工作系统
从本地系统运行另一个 SSH 或 Rsync
SCP 不会导致问题,但 RSYNC 显然会进行 ssh 登录,因为我看到端口转发失败,因为文件复制过来
远程加密/解密现在失败
修复
对于第 3 步和第 4 步,我已经看到它是双向的,有时管道仍然存在,有时它们正确地消失了。可能还需要删除管道文件并重新登录并确保重新创建它们。
现在一切都应该再次用于加密/解密
更新 - 更简单的修复
今天发生这种事情没有任何理由或理由,我很生气。我不得不来找这篇文章,我懒得去做我原来的帖子告诉我要修复的所有事情。我从上述猜想的角度考虑了这种情况。长话短说,这行得通:
一切都恢复正常