TLDR:如果你将 GpgME 升级到了版本 2 以上,邮件客户端 Thunderbird 的「外部 GnuPG 集成」会报错。解决方法是在 Thunderbird 的 about:config 中将 mail.openpgp.load_untested_gpgme_version 设置为 45。目前受影响的范围包括:Windows 上的 Gpg4Win 5+,以及发行版 Arch Linux、Debian sid、Fedora Rawhide。此外,如果你在 Windows 并且之前按照 Mozilla 维基 的要求修改过 PATH,需要再次修改。
我最近把 Gpg4Win 更新到了版本 5,结果发现它把我的邮件客户端 Thunderbird 的加解密和签名搞坏了。
背景是这样的:Thunderbird 有一套基于 RNP 的原生 OpenPGP 实现;然而,这个实现并不支持 GnuPG 的很多特性,例如 OpenPGP 智能卡。因为我的密钥在 YubiKey 上,Thunderbird 原生的 PGP 我就用不了了。
为了我这样的用户,Thunderbird 允许使用系统的 GnuPG;它用 GpgME 库调用 gpg。这个操作的全网缺乏文档,我记得我当时参考的是 Mozilla wiki。
注:很多年之前 Thunderbird 用户的 PGP 功能是通过 Enigmail 插件的;但内置之后这个插件就不再支持了。
然而我发现 Gpg4Win 5 更新之后我的 Thunderbird 就无法加解密了。经过调查,这是因为 Gpg4Win 内的 GpgME 升级到了版本 2,在 Windows 上的文件是 libgpgme-45.dll(linux 下则是 libgpgme.so.45),而 Thunderbird 默认只会加载硬编码的 libgpgme-11.dll 或 libgpgme.so.11,也就是 GpgME 1.x 的版本。相关的代码逻辑在这里。该问题在 Bugzilla 上已经有了大半年了,并在 Thunderbird 140.8.1esr 中修复了;修复方式是提供了一个新的配置 mail.openpgp.load_untested_gpgme_version,允许用户指定加载哪个版本的 GpgME。
- 在 Thunderbird 中打开 Settings - “Config Editor”。
- 搜索
mail.openpgp.load_untested_gpgme_version。 - 把它设为
45。
完成设置后,Thunderbird 应该就能重新无缝调用 GnuPG 了。虽然在 release note 里面有写,但除此之外几乎没有任何文档说明,所以我写这篇博客来试图帮助一些同样遇到这个问题的网友。
不过,既然这个叫作 untested,就说明有一部分功能并不完全兼容;比如说新版本 gpg / gpgme 支持的 LibrePGP 格式的密钥/签名(v5 packet)等,Thunderbird 就不支持(并且因为 RNP 基于 RFC 9580,所以未来也不太可能支持)。这是因为 PGP 标准化社群的一些 drama;可以参考 [1] [2]。
补充:Windows 用户的 PATH 环境变量
如果你在 win64 上用 Gpg4Win,上述 wiki 写要把 C:\Program Files (x86)\Gpg4Win\bin_64 添加到 PATH 中;但 Gpg4Win 5.x 还有另一个更新:它现在默认就是 x64 的,所以默认安装在了 C:\Program Files\,而且也无所谓 bin_64 了(默认 bin 就是 x64 的,32 位库反而在 bin_32)。因此,你需要把你的 PATH 里面的安装路径改成 C:\Program Files\Gpg4Win\bin。