Pinentry 使用 gpg-agent 和 SSH 失败

Spa*_*ack 12 ssh gpg-agent pinentry

我正在运行 Fedora 22。我正在尝试设置 GnuPG,以便使用位于 Yubikey Neo 上的 PGP 身份验证子密钥对我的 SSH 连接进行身份验证。

我有一个 systemd 单元启动 gpg-agent 如下:

/usr/bin/gpg-agent --homedir=%h/.gnupg --daemon --use-standard-socket
Run Code Online (Sandbox Code Playgroud)

我在配置中启用了 SSH 支持:

enable-ssh-support
pinentry-program /usr/bin/pinentry-gtk
Run Code Online (Sandbox Code Playgroud)

设置的其他部分包括将我的密钥的keygrip添加到~/.gnupg/sshcontrol文件、将我的公钥添加到远程主机并声明环境变量

全局查看设置似乎有效的各种日志,我可以看到 SSH 找到了密钥,但实际上未能使用它进行签名。如果我查看 中的日志gpg-agent,我可以看到它无法启动该pinentry程序,因此没有请求 PIN 码:

2015-07-22 23:23:28 gpg-agent[6758] DBG: error calling pinentry: Ioctl() inappropriate for a device <Pinentry>
2015-07-22 23:23:28 gpg-agent[6758] DBG: chan_8 -> BYE
2015-07-22 23:23:28 gpg-agent[6758] DBG: chan_7 -> CAN
2015-07-22 23:23:28 gpg-agent[6758] DBG: chan_7 <- ERR 100663573 The IPC call was canceled <SCD>
2015-07-22 23:23:28 gpg-agent[6758] smartcard signing failed: Ioctl() inappropriate for a device
2015-07-22 23:23:28 gpg-agent[6758] ssh sign request failed: Ioctl() inappropriate for a device <Pinentry>
Run Code Online (Sandbox Code Playgroud)

我们在这里看到的是,当与 SSH 结合使用时,某些 ioctl 调用在调用 pinentry 时失败。但是,如果我运行以下命令:

$ echo "Test" | gpg2 -s
Run Code Online (Sandbox Code Playgroud)

PIN 窗口弹出,一切正常。

你能帮我理解这个设置和 SSH 发生了什么吗?

小智 19

嗯,这对我有用:

export GPG_TTY=`tty`
Run Code Online (Sandbox Code Playgroud)

将此添加到您的.bashrc或在使用 gpg 之前踢它。


Spa*_*ack 12

我在GPG 网站上找到了答案。代理无法找到在哪个屏幕上显示 Pinentry 窗口。我只需要将以下内容放入我的.*shrc文件中:

echo "UPDATESTARTUPTTY" | gpg-connect-agent > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

  • *“特工未能找到在哪个屏幕上显示 Pinentry 窗口......”* - 哈哈...... 1980 年代的弱智软件。难怪很少有人使用GPG。也许 GPG 应该选择我正在研究的那个,并停止提供无用的错误消息。 (3认同)