gpg2 运行速度过慢,仅当代理没有缓存密码时

Sor*_*tad 6 encryption gnupg gpg-agent

最近,我的通行证密码管理器开始花费 45 秒以上的时间来显示主密码的 gpg-agent 密码提示,当我尝试登录网站并且必须坐在那里盯着密码时,这非常烦人提示一分钟。

我开始做一些测试,发现 gpg2 代理似乎有问题。当我运行 gpg1 时,没有配置任何代理,速度非常快(这包括输入密码的时间):

$ time gpg -vvv -d BitBucket.gpg
real    0m2.940s
user    0m0.024s
sys     0m0.004s
Run Code Online (Sandbox Code Playgroud)

但是当我对同一个文件运行 gpg2 (代理需要使用 gpg2)时,速度非常慢:

$ time gpg2 -vvv -d BitBucket.gpg
real    0m53.421s
user    0m0.000s
sys     0m0.004s
Run Code Online (Sandbox Code Playgroud)

然而,既然代理已经缓存了我的密码,速度又快了:

$ time gpg2 -vvv -d BitBucket.gpg
real    0m0.126s
user    0m0.004s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

这并不是解密速度慢——一旦密码提示最终出现,它就会在或多或少的正常时间内解密。只是代理需要很长时间才能加载并显示密码提示。

详细的日志不会产生任何有用的信息。输出如下所示(不相关和/或敏感信息替换为<angle-bracketed text>

$ gpg2 -vvv -d BitBucket.gpg
gpg: using character set 'utf-8'
<key parameters>
:pubkey enc packet: version 3, algo 1, keyid <X>
        data: [2048 bits]
gpg: public key is <Y>
gpg: using subkey <Y> instead of primary key <Z>
[...here it locks up for 45-ish seconds and then pops up the agent prompt]
gpg: public key encrypted data: good DEK
<key parameters>
:encrypted data packet:
        length: 200
        mdc_method: 2
gpg: using subkey <Y> instead of primary key <Z>
gpg: encrypted with 2048-bit RSA key, ID <Y>, created 2012-03-07
      <ME>
gpg: AES256 encrypted data
<key parameters>
:literal data packet:
        mode b (62), created 1525637737, name="",
        raw data: 151 bytes
gpg: original file name=''
<the content of the password file>
gpg: decryption okay
Run Code Online (Sandbox Code Playgroud)

我尝试使用手册页中描述的选项来杀死并手动重新加载,希望得到解释为什么花了这么长时间,但在我做了几次解密操作后打印的唯一一行是gpg-agent--log-file

2019-07-24 17:49:13 gpg-agent[19648] gpg-agent (GnuPG) 2.1.11 started
Run Code Online (Sandbox Code Playgroud)

这显然不是很有帮助!

我尝试更改pinentry-program我的~/.gnupg/gpg-agent.conf,但不同的 GUI 表现相似。

我找到了这个线程,但这似乎与加密有关(由于缺乏随机性,这可能会被阻止,但真正的随机性似乎不太需要启动 gpg-agent)。

我还发现了一个关于速度慢的线程--check-trustdb,有时会在每个命令上执行,但我--check-trustdb自己运行,它完成时没有明显的延迟:

$ time gpg2 -vvv --check-trustdb
real    0m0.009s
user    0m0.008s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

我接下来可以尝试什么来弄清真相?

xai*_*zek 3

该问题实际上与 相关pinentry,但只是间接相关。pinentry-*对于那些不尝试查询密钥环守护进程的实现,这种情况不会发生。

正在使用的守护进程很可能是gnome-keyring-daemon导致挂起的原因(顺便说一句,还有一些其他的密钥环实现)。来自GPG 错误报告

延迟是由 pinentry 查询 GNOME 密钥环引起的。添加no-allow-external-cache到您的 gpg-agent.conf,或修复您的 GNOME 安装,或向 GNOME 人员报告问题。

其他一些可能的解决方案:

  • killall gnome-keyring-daemon(将在下次使用时自动启动,可能不会再挂起,无需重新启动)
  • gnome-keyring如果不使用则卸载包