gpg2 运行速度异常缓慢,仅当代理没有密码缓存时才会发生

gpg2 运行速度异常缓慢,仅当代理没有密码缓存时才会发生

最近,我的经过密码管理器已经开始花费长达 45 秒的时间来调出 gpg-agent 密码提示来输入我的主密码,当我尝试登录网站并不得不坐在那里盯着密码提示一分钟时,这非常烦人。

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

$ time gpg -vvv -d BitBucket.gpg
real    0m2.940s
user    0m0.024s
sys     0m0.004s

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

$ time gpg2 -vvv -d BitBucket.gpg
real    0m53.421s
user    0m0.000s
sys     0m0.004s

但是,现在代理已经缓存了我的密码,它的速度又变快了:

$ time gpg2 -vvv -d BitBucket.gpg
real    0m0.126s
user    0m0.004s
sys     0m0.000s

并不是解密速度慢——一旦密码提示最终出现,解密时间大致正常。只是代理需要很长时间才能加载并显示密码提示。

详细日志不会产生任何有用的信息。输出如下所示(无关和/或敏感信息被替换为<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

我尝试使用手册页中描述的选项终止程序并手动重新加载gpg-agent--log-file希望能够解释为什么花了这么长时间,但是在我执行了几次解密操作之后,只打印了一行:

2019-07-24 17:49:13 gpg-agent[19648] gpg-agent (GnuPG) 2.1.11 started

这显然没有什么帮助!

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

有什么想法我可以尝试下一步来彻底解决这个问题?

答案1

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

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

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

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

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

答案2

在我的 Debian 系统上,GPG 提示密码之前长时间的延迟是由程序引起的pinentry。默认情况下设置为pinentry-gnome3,将其更改为pinentry-curses似乎已解决问题。

我注意到您在问题中说不同的 GUI 表现pinentry-program类似。而且问题在重启后消失,所以您遇到的问题似乎不同。多年来,我在几个系统上遇到过这种长时间延迟的情况,在某些情况下,重启并没有帮助,所以我会记录这个答案,以防其他人觉得有用。

为了修复它,我运行了这个命令并选择pinentry-curses

sudo update-alternatives --config pinentry

对于非 Debian 系统,您可以检查哪一个是符号链接到的/usr/bin/pinentry

ls -l /usr/bin/pinentry

更新它可能看起来像这样:

sudo rm /usr/bin/pinentry
sudo ln -s /usr/bin/pinentry-curses /usr/bin/pinentry

请多加小心,尤其是当/usr/bin/pinentry它不是符号链接时。您的发行版可能有其他方法可以做到这一点。

将其更新为使用pinentry-curses(或pinentry-tty)后,长时间的延迟就会消失。

答案3

困惑不已,我按照 Windows 用户的操作重启了 PC(尽管我在这里运行的是 Linux),令人惊讶的是问题消失了。我猜一定是另一个正在运行的进程存在某种争用问题。

如果这种情况再次发生,我会回来更新,并且能够确定具体罪魁祸首是什么。lsofgpg-agent 列出的条目似乎没有表明任何可能的问题,我仔细检查以确保没有任何其他正在运行的代理或 GPG 进程。

相关内容