gpg-agent 不断为智能卡保存密码

信息安全 gnupg 智能卡 enigmail
2021-08-19 03:21:01

我今天发现,enigmail 在不询问我智能卡 PIN 的情况下解密消息。它只问一次,然后根本不问。

这是我的 gpg-agent.conf:

default-cache-ttl 0
max-cache-ttl 0
no-allow-external-cache
ignore-cache-for-signing

scdaemon.conf:

card-timeout 0
deny-admin

gpg.conf 为空

gpg (GnuPG) 2.1.16

libgcrypt 1.7.3-beta

Gnome 密钥环已停止。我在这里想念什么?

3个回答

我自己一直在研究这个。每次我请求我的智能卡(在我的情况下是 Yubikey)进行签名/加密/身份验证操作时,我都希望被提示输入我的 PIN。forcesig可以通过启用启用此行为进行签名gpg2 --card-edit(请参阅GnuPG 文档):

forcesig   toggle the signature force PIN flag

但不适用于加密和身份验证操作。

Werner Koch 本人在 GnuPG 邮件列表上的这篇文章似乎暗示智能卡本身正在缓存 PIN。

如果我找到更多信息,我将进一步调查(可能向 GnuPG 邮件列表发送电子邮件)并更新此答案。

我发现一个简单的解决方法是在后台运行一个 bash 脚本,每隔 X 秒重新加载一次 gpg-agent。具体来说,将其附加到~/.bashrc

while true; do gpgconf --kill gpg-agent; sleep X; done &

其中 X 表示您希望 pin 存储多长时间(以秒为单位)。请注意,此脚本还将终止任何其他与 gpg 相关的进程,因此如果您将 gpg 主要用于 pinentry 进程,则它只是一个快速修复。

这将在后台运行,但可以使用jobs命令访问,同样使用命令停止kill

根据我的研究,这card-timeout是一个虚拟参数,从来没有打算强制缓存智能卡 pin 的时间限制。

此错误报告中的一些有趣引用

让我解释一下情况。

在 scdaemon 手册中,它解释为 scdaemon 将按指定的值关闭智能卡。但是,它从未像描述的那样实现过。

在 2.0 中,它是一个控制 scdaemon 以允许 DISCONNECT 命令的变量。在 2.1 中,scdaemon 已改进为始终允许 DISCONNECT 命令。

因此,确实,这个变量在 2.1 中没有影响。

多年来(从 GnuPG 2.1 开始)它一直是一个虚拟选项。为了记录,我在这里写了更多细节。

它从来没有像这些错误报告者预期的那样工作(通过超时直接控制从 scdaemon 到卡的访问),它只改变了 DISCONNECT 命令的行为。用户无论如何都需要发出 DISCONNECT 命令,并且该选项可以更改 DISCONNECT 的完成方式。<-- 这是 2.0。

从 2.1 开始,无论此选项如何,DISCONNECT 命令都可以正常工作。