#openpgp #pgp #signing #encryption #encryption-key

sequoia-octopus-librnp

使用Sequoia重写的RNP接口,用于Thunderbird

17个稳定版本

1.10.0 2024年8月12日
1.9.0 2024年6月15日
1.8.1 2024年3月19日
1.6.1 2023年12月15日
1.0.1 2021年4月8日

#282 in 加密学

Download history 1/week @ 2024-05-25 1/week @ 2024-06-01 184/week @ 2024-06-15 6/week @ 2024-06-22 4/week @ 2024-06-29 28/week @ 2024-07-06 123/week @ 2024-08-10

123 每月下载量

LGPL-2.0-or-later

545KB
11K SLoC

Thunderbird的Sequoia-based OpenPGP后端

这是Thunderbird支持的RNP库的替代品。

该项目被称为章鱼,因为章鱼可以适应不寻常的地方,在这个项目中,我们使用Sequoia重写了Thunderbird使用的RNP API。

章鱼的柔软身体意味着只要洞口不小于它们身体唯一坚硬的部分——它们的喙,它们就可以适应不可思议的小缝隙。如果所有其他方法都失败了,章鱼可以失去一条手臂,并在以后再生一条。

注意事项

Thunderbird的开发者不支持替换RNP,并使我们的解决方案集成变得困难。我们定期运行Thunderbird的测试,使用ESR91和beta版本的Thunderbird。我们非常确信章鱼是安全的,并且至少提供了与RNP相同的安全级别。

尽管如此,定期备份您的Thunderbird配置文件和产品密钥(至少包括 pubring.gpgsecring.gpg,和 openpgp.sqlite)并了解如何恢复是一个好主意。

已知限制

  • 可能会有龙。

  • 当Thunderbird自动更新时,它会用其自己的版本覆盖Octopus的 librnp.so 版本。此问题已报告给Thunderbird

  • Thunderbird在启动时读取和缓存可用的证书。因此,即使您将新证书添加到gpg,章鱼也会加载它,但Thunderbird不会注意到它,直到您手动使用Thunderbird的OpenPGP Keyring ManagerFileReload Key Cache重新导入密钥,或者重启Thunderbird。

    注意:Thunderbird仅缓存密钥列表和一些元数据,因此它将通常利用插入到gpg密钥库或通过Parcimonie获取的任何更新。

支持

章鱼由Sequoia PGP团队积极维护。我们将回应问题和支持请求,但我们没有积极开发新功能(然而,章鱼应该与Thunderbird默认后端具有相同的功能)。我们的使命是特别改善OpenPGP生态系统,更一般地改善互联网自由工具。如果您想为章鱼的开发或Sequoia PGP项目(总体而言)提供财务支持,请与我们联系。

过去,我们主要依靠pep基金会的资金。

目前,章鱼在Thunderbird之外开发。这样做的主要原因是因为Thunderbird的开发者不希望在最近投资RNP之后,再投资资源支持一个新的OpenPGP后端。

在测试方面,章鱼包含了一些单元测试。我们的CI在Debian和Windows上针对所有提交运行这些检查。它还在Debian上运行了Thunderbird相关的单元测试

构建 & 安装

使用官方Linux发行版软件包

Fedora

自Fedora 34以来,章鱼可以从标准Fedora仓库中获取。官方Thunderbird软件包也已适配,允许用户选择使用哪个可用的PGP后端。

如果thunderbird软件包已经安装(且至少为版本91),则可以通过运行以下命令交换RNP后端与章鱼:

sudo dnf swap thunderbird-librnp-rnp sequoia-octopus-librnp

切换回默认后端的方法相同,只是对于dnf swap命令的参数是反过来的

sudo dnf swap sequoia-octopus-librnp thunderbird-librnp-rnp

如果Thunderbird尚未安装,那么可以在安装时指定首选的OpenPGP后端

sudo dnf install thunderbird sequoia-octopus-librnp

openSUSE

软件包sequoia-octopus-librnp在openSUSE Tumbleweed中可用。与Fedora一样,这个软件包将替换掉MozillaThunderbird-openpgp-librnp中提供的默认库。

要安装sequoia-octopus-librnp,请运行以下命令:

sudo zypper install sequoia-octopus-librnp

然后通过选择卸载MozillaThunderbird-openpgp-librnp来解决冲突。

切换回的方法类似

sudo zypper install MozillaThunderbird-openpgp-librnp

然后通过选择卸载sequoia-octopus-librnp来解决冲突。

如果Thunderbird尚未安装,那么可以在安装时指定首选的OpenPGP后端

sudo zypper install MozillaThunderbird sequoia-octopus-librnp

手动构建

首先,您需要安装Sequoia的构建依赖项。然后,构建章鱼只需调用cargo build即可,可选地使用--release标志构建适用于最终用户的优化版本。非发布版本将调试和跟踪信息打印到stderr。您可以选择Sequoia的其中一个加密后端,例如,在Windows上,您可能想要使用Windows CNG后端而不是Nettle后端。

构建的结果是一个共享库(例如,Linux 和 *BSD 上的 *.so,Windows 上的 *.dll 等)。要使用它,请让 Thunderbird 选择它而不是它携带的 librnp.so,例如通过替换它。具体细节取决于您的部署,这是发行商需要解决的问题。本文件将演示如何在 Thunderbird 的本地构建中替换 RNP。

注意:八爪鱼与 RNP 完全向后兼容。特别是,它使用相同的格式来存储密钥,并以相同的方式存储它们。因此,如果您决定不喜欢八爪鱼,可以简单地恢复原始的 librnp,重启 Thunderbird,Thunderbird 将像以前一样使用所有数据工作。当然,您仍然应该备份(至少 pubring.gpgsecring.gpgopenpgp.sqlite)。

在 Linux 上构建

要使用调试构建,请执行以下操作

cargo build
cp target/debug/libsequoia_octopus_librnp.so path/to/thunderbird/obj-x86_64-pc-linux-gnu/dist/bin/librnp.so

要使用发布构建,请执行以下操作

cargo build --release
cp target/release/libsequoia_octopus_librnp.so path/to/thunderbird/obj-x86_64-pc-linux-gnu/dist/bin/librnp.so

在 Debian 稳定版上,无法构建八爪鱼的现代版本。您可以遵循 这些说明

选择不同的加密后端

要选择不同的加密后端(例如 OpenSSL)并创建调试构建,请执行以下操作

cargo build --no-default-features --features crypto-openssl,net
cp target/debug/libsequoia_octopus_librnp.so path/to/thunderbird/obj-x86_64-pc-linux-gnu/dist/bin/librnp.so

要使用发布构建,请执行以下操作

cargo build --no-default-features --features crypto-openssl,net --release
cp target/release/libsequoia_octopus_librnp.so path/to/thunderbird/obj-x86_64-pc-linux-gnu/dist/bin/librnp.so

请参阅 https://gitlab.com/sequoia-pgp/sequoia/-/tree/main/openpgp#crypto-backends 了解可用后端。

在 Windows 上(MSVC)构建

即使在 64 位 Windows 上,也存在一些 Thunderbird 的 32 位安装。Thunderbird 和八爪鱼的位数必须匹配,因此请通过“关于 Thunderbird”进行检查。

MSVC 工具链仅支持 Windows CNG 加密后端。

以下说明创建调试构建。要创建发布构建,请在 cargo buildcargo build --release ...)之后添加 --release

对于 64 位构建,运行

rustup target add x86_64-pc-windows-msvc
cargo build --no-default-features --features crypto-cng,net --target x86_64-pc-windows-msvc
cp target/x86_64-pc-windows-msvc/debug/sequoia_octopus_librnp.dll "C:\Program Files\Mozilla Thunderbird\rnp.dll"

对于 32 位构建,运行

rustup target add i686-pc-windows-msvc
cargo build --no-default-features --features crypto-cng --target i686-pc-windows-msvc
cp target/i686-pc-windows-msvc/debug/sequoia_octopus_librnp.dll "C:\Program Files (x86)\Mozilla Thunderbird\rnp.dll"

在 Windows 上(MSYS2)构建

即使在 64 位 Windows 上,也存在一些 Thunderbird 的 32 位安装。Thunderbird 和八爪鱼的位数必须匹配,因此请通过“关于 Thunderbird”进行检查。

MSYS2 工具链支持 Nettle 和 Windows CNG 加密后端。

以下说明创建调试构建。要创建发布构建,请在 cargo buildcargo build --release ...)之后添加 --release

对于使用 CNG 的 64 位构建,运行

rustup target add x86_64-pc-windows-gnu
cargo build --no-default-features --features crypto-cng,net --target x86_64-pc-windows-gnu
cp target/x86_64-pc-windows-gnu/debug/sequoia_octopus_librnp.dll "C:\Program Files\Mozilla Thunderbird\rnp.dll"

对于使用 CNG 的 32 位构建,运行

rustup target add i686-pc-windows-gnu
cargo build --no-default-features --features crypto-cng --target i686-pc-windows-gnu
cp target/i686-pc-windows-gnu/debug/sequoia_octopus_librnp.dll "C:\Program Files (x86)\Mozilla Thunderbird\rnp.dll"

对于使用 Nettle 的 64 位构建,运行

rustup target add x86_64-pc-windows-gnu
cargo build --target x86_64-pc-windows-gnu
cp target/x86_64-pc-windows-gnu/debug/sequoia_octopus_librnp.dll "C:\Program Files\Mozilla Thunderbird\rnp.dll"

对于使用 Nettle 的 32 位构建,运行

rustup target add i686-pc-windows-gnu
cargo build --target i686-pc-windows-gnu
cp target/i686-pc-windows-gnu/debug/sequoia_octopus_librnp.dll "C:\Program Files (x86)\Mozilla Thunderbird\rnp.dll"

使用 Debian 的 Thunderbird

以下说明与 Thunderbird 的版本 1:115.5.0-1~deb12u1(来自 Debian Bookworm)进行了测试。这使用 dpkg 的重定向机制将 librnp.so 移除。

$ sudo apt install thunderbird
...
thunderbird is already the newest version (1:78.9.0-1~deb10u1).
...
$ ls -l /usr/lib/thunderbird/librnp.so
-rw-r--r-- 1 root root 723248 Mar 24 19:57 /usr/lib/thunderbird/librnp.so
$ sudo dpkg-divert --divert /usr/lib/thunderbird/librnp-orig.so --rename /usr/lib/thunderbird/librnp.so
Adding 'local diversion of /usr/lib/thunderbird/librnp.so to /usr/lib/thunderbird/librnp-orig.so'
$ sudo cp .../target/release/libsequoia_octopus_librnp.so /usr/lib/thunderbird/
$ sudo ln -sf libsequoia_octopus_librnp.so /usr/lib/thunderbird/librnp.so
$ ls -l /usr/lib/thunderbird/*rnp*
-rw-r--r-- 1 root root    723248 Mar 24 19:57 /usr/lib/thunderbird/librnp-orig.so
lrwxrwxrwx 1 root root        28 Apr  7 13:59 /usr/lib/thunderbird/librnp.so -> libsequoia_octopus_librnp.so
-rwxr-xr-x 1 root root 129988280 Apr  7 14:01 /usr/lib/thunderbird/libsequoia_octopus_librnp.so

如果您使用的是调试版本,则将 'release' 更改为 'debug'。

要卸载八爪鱼,只需删除符号链接和重定向即可。

$ sudo rm /usr/lib/thunderbird/librnp.so
$ sudo dpkg-divert --rename --remove /usr/lib/thunderbird/librnp.so
Removing 'local diversion of /usr/lib/thunderbird/librnp.so to /usr/lib/thunderbird/librnp-orig.so'
$ ls -l /usr/lib/thunderbird/*rnp*
-rw-r--r-- 1 root root    723248 Mar 24 19:57 /usr/lib/thunderbird/librnp.so
-rwxr-xr-x 1 root root 129988280 Apr  7 14:01 /usr/lib/thunderbird/libsequoia_octopus_librnp.so

Windows 的预编译二进制文件

如果您特别勇敢,可以下载 Windows 的预编译 rnp.dll

这些二进制文件是由我们的持续集成(CI)生成的。它们对应于当前 main 分支的版本。在代码被检查到 main 分支之前,它必须首先通过 Debian 和 Windows 上的单元测试,并且在 Debian 上必须通过 Thunderbird 的单元测试。

要使用 Octopus,请替换您 Thunderbird 安装中的 rnp.dll 二进制文件。Thunderbird 通常安装到 C:\Program Files\Mozilla Thunderbird

如果您遇到任何错误并希望进行调查,还有适用于 64 位 Thunderbird 的调试版本可用。

在用 Octopus 启动 Thunderbird 之前,请务必备份您的 Thunderbird 配置文件中的 pubring.gpgsecring.gpgopenpgp.sqlite 文件。您的 Thunderbird 配置文件通常位于 C:\Users\USERNAME\AppData\Roaming\Thunderbird\Profiles\PROFILEXXX.default

附加功能

此库包含一些增强 Thunderbird 的附加功能。

GNUPG 密钥环集成

当 Thunderbird 启动时,它会要求 RNP 解析其密钥环。此时,Octopus 还会运行 gpg --export 并将其包含在结果中。这使得用户的 GnuPG 密钥环可用于 Thunderbird。(从那时起,Octopus 还会监视 GnuPG 的密钥存储库以获取更新。)可以通过将环境变量 GNUPGHOME 设置为 /dev/null 来禁用此功能,如下所示

GNUPGHOME=/dev/null thunderbird

从 GnuPG 导入的证书可以像普通证书一样使用。您可以在 Thunderbird 的 OpenPGP 密钥管理器中检查它们,设置它们的 "接受" 等等。

存在两个已知的限制。首先,首次执行 OpenPGP 操作时,Thunderbird 会扫描密钥存储库并创建可用密钥的索引。目前,Thunderbird 不会自动更新此索引。因此,添加到 gpg 的密钥存储库中的密钥在手动刷新缓存(OpenPGP Keyring ManagerFileReload Key Cache)或重新启动 Thunderbird 之前将不可见。其次,如果您使用 Thunderbird 证书管理器删除由 GnuPG 管理的证书,它将不会被从内存密钥存储库中删除,但目前实际上不会从您的 gpg 密钥存储库中删除。因此,它将在下一次 Thunderbird 加载密钥环时再次出现。

Octopus 会仔细跟踪从 GnuPG 加载的证书,并且仅在它们被修改时将它们写入 Thunderbird 的密钥环;目前不会将修改后的证书写回 GnuPG。但是,计划进行与 GnuPG 密钥环的更紧密集成。

gpg 代理集成

Octopus 会自动监视哪些密钥被加载到 gpg 的代理中,并向 Thunderbird 报告这些密钥的私钥材料可用。这意味着您可以在 Thunderbird 中轻松地将由代理管理的密钥标记为个人密钥,而无需修改 Thunderbird 的配置文件。此外,尝试解密加密到由代理管理的密钥的消息会自动转发给代理进行解密。

与 Thunderbird 不同,Octopus 直接与代理进行通信。因此,无需安装 GPGME;您只需要在 PATH 中有 gpg

GNUPG 的 Web of Trust 数据

Thunderbird 仅支持用于验证 OpenPGP 证书的自定义 "接受" 机制。Thunderbird 忽略密钥签名,并且无法添加 证书颁发机构

当Thunderbird启动时,八爪鱼会读取gpg的信任数据库,并将其合并到Thunderbird的接受数据库中。这意味着被认为是通过GnuPG认证的证书也被Thunderbird认为是已认证的。

这种集成是经过精心设计的。如果用户在Thunderbird中手动接受了一个证书,则不会覆盖该设置。这不仅在初始导入时会发生,而且在以后也会发生:当用户在Thunderbird中接受一个证书时,八爪鱼会检测到这一点,并将不再根据GnuPG的信任数据库更新该证书的接受状态。

八爪鱼会监控GnuPG信任数据库的更改。因此,与向GnuPG密钥库添加新证书不同,不需要重启Thunderbird即可注意到信任数据库的更改。

Parcimonie

Parcimonie是一种功能,它使用多种隐私保护技术自动在后台刷新用户的OpenPGP证书。特别是,更新是错开的,更新时间是从一个无记忆分布中抽取的,以挫败想要预测用户何时检查更新的攻击者。Enigmail有自己的这种机制版本,但在将其集成到Thunderbird中时已被移除。

八爪鱼中的Parcimonie功能目前使用上述隐私保护机制检查各种OpenPGP密钥服务器(keys.openpgp.orgProton密钥服务器Mailvelope密钥服务器keyserver.ubuntu.com)以及适当的Web密钥目录(WKDs)的更新,平均每周检查一次所有非撤销的有效证书。它还支持合并来自无用户ID证书的更新。

在导入证书之前,我们首先检查它是否看起来是洪水的。如果是这样,我们将从我们没有证书的密钥中去除第三方认证,因为这些认证实际上是无用的。

弱密码学

八爪鱼使用Sequoia,默认情况下拒绝已知弱密码算法。Sequoia以及扩展到八爪鱼,拒绝使用弱密码原语的证书和消息。由于RNP没有一种机制来指示证书或组件不应使用,八爪鱼将这些密钥报告为在创建后一秒已过期。

尊重系统级密码政策

八爪鱼读取一个配置文件(默认为/etc/crypto-policies/back-ends/sequoia.config)来配置其密码政策。可以使用SEQUOIA_CRYPTO_POLICY环境变量覆盖要加载的文件。有关格式的更多信息,请参阅此文档

非功能性优势

与RNP相比,Sequoia有许多非功能性优势。

静态加密密钥

当Sequoia不使用时,它会自动在内存中加密未加密的密钥材料。这使得密钥泄露如Heartbleed更加困难,并保护免受Spectre、Rowhammer等攻击。OpenSSH使用相同类型的保护。

RNP具有锁定和解锁密钥的概念,但这很明确,Thunderbird在使用后并不总是重新锁定密钥。

SHA-1缓解措施

SHA-1已损坏。不幸的是,SHA-1仍然被广泛使用。为了应对这个问题,Sequoia实现了一系列的对策。

  • Sequoia使用SHA1-CD,这是一种SHA-1的变体,可以检测并缓解碰撞攻击。这种保护措施也被GitHub等其他平台使用。

碰撞保护

Sequoia在签名和自签名中包含盐分,以防御碰撞攻击等。例如,OpenSSH也这样做。如果另一个散列函数的碰撞防御被破坏,这将挫败攻击者尝试进行Shambles式攻击的企图。

无脑裂问题

RNP维护独立的公钥和私钥环。这可能导致所谓的脑裂问题,即证书同时存在于两个密钥环中,有时返回一个版本,有时返回另一个版本。这也是GnuPG 1.x所使用的模型,也是GnuPG迁移到GnuPG 2.0中一个开放PGP密钥库的原因之一,其中只有密钥材料由代理持有。

为了避免这个问题,Octopus合并了两个数据库。为了与RNP保持向后兼容,当Octopus写入证书时,带有密钥材料的证书写入到secring.gpg,而没有的则写入到pubring.gpg

多线程

得益于Rust的更安全的并发范式,Octopus使用线程比其他语言编写的库更安全、更简单。例如,Octopus使用它来更快地解析密钥环。并在后台执行更新。

OpenPGP一致性

Sequoia实现了几乎所有 OpenPGP RFC。缺失的部分要么是过时的,要么是不安全的。

RNP没有实现一些重要部分。例如,RNP不处理“神秘”的密钥,如共享密钥,其中只有加密子密钥的密钥材料被共享。这是一个兼容性问题。更多示例可以在OpenPGP互操作性测试套件中找到。

调试

当Octopus以调试模式构建时,它可以向stderr(或在Windows上Thunderbird配置文件目录中的octopus.log)输出跟踪信息。根据环境变量SEQUOIA_OCTOPUS_TRACING的设置,有几种模式可供选择:模式有

  • 默认情况下,只有失败才会被跟踪。

  • call跟踪所有带有其参数和结果的函数调用。

  • full选择完整跟踪模式。

请注意,跟踪信息可能包含敏感信息,如OpenPGP指纹和用户ID,但不应包含密钥材料。始终使用最简洁的日志级别来展示问题,并在提交到公共缺陷跟踪器之前检查日志并删除敏感信息。

依赖项

~79MB
~1.5M SLoC