很难弄清楚此行为的调试步骤。
我将运行一些gpg
命令,通常大约 20 秒后会弹出一个 GUI Pinentry 窗口,我可以在其中输入密码并继续执行命令。
但有时,提示会立即出现在我的终端中(无需我更改任何配置)。在其他极少数情况下,GUI Pinentry 将是即时的。
有一次我注意到 GUI Pinentry 是即时的,当时我在一台显示器上运行。我通常通过 HDMI 将外部显示器连接到我的笔记本电脑。
另一次,我注意到终端中出现提示是当我的窗口管理器崩溃时,我从单独的 TTY 中终止了 Xorg 服务器进程,然后重新启动了我的窗口管理器。
我正在运行 Manjaro Linux,并使用 StumpWM 作为窗口管理器。我不确定还有哪些其他软件或配置与此相关。
答案1
TLDR:我需要将--daemonize
标志传递给gnome-keyring-daemon
.
我有/usr/bin/gnome-keyring-daemon --start --components=gpg,pkcs11,secrets,ssh
在我的.xinitrc
。
添加--daemonize
参数似乎已经解决了这个问题。
/usr/bin/gnome-keyring-daemon --daemonize --start --components=gpg,pkcs11,secrets,ssh
以下是我为解决此问题而采取的故障排除步骤的大杂烩,以防您遇到类似的问题但不完全相同。
我从一包我认为相关的关键字开始:gpg、keyring、gpg-agent、pinentry、gpg 密码提示。
搜索 的输出journalctl -xe
以获取相关的信息。在这种情况下,我看到:
无法使用秘密服务查找密钥 <...> 的密码:为 org.freedesktop.secrets 调用 StartServiceByName 时出错...>
这给了我另一个要搜索的关键字:org.freedesktop.secrets
。在输出中查找journalctl
这导致我找到另一个条目:
dbus-daemon[2210]:[会话uid = 1000 pid = 2208]无法激活服务'org.freedesktop.secrets':超时(service_start_timeout = 120000ms)
这给了我另一个关键词dbus-daemon
......
我曾经dbus-monitor
查看通过 DBus 发送的内容并读取任何错误输出。
我还向 DBus 发送了一条消息以查看是否org.freedesktop.secrets
正在运行。 (https://rtfm.co.ua/en/what-is-linux-keyring-gnome-keyring-secret-service-and-d-bus/)
dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames
...
string "org.freedesktop.secrets"
...
一切都表明该org.freedesktop.secrets
服务没有运行。
gpg-agent
、org.freedesktop.secrets
、 和 是如何dbus-daemon
连接的?
gpg-agent
通过“DBus”与“密钥环”对话。就我而言,我的钥匙圈是gnome-keyring-daemon
。
答案2
我也遇到过这个问题。每次我都要等 25 秒才能弹出 pinentry。
从 Eric Ihli 的回答中得知问题出在钥匙圈上,我可以通过以下方式关闭该功能:
# ~/.gnupg/gpg-agent.conf
...
# Don't ask gnome-keyring for password
no-allow-external-cache
...