#用户密钥 #OpenPGP #PGP #用户组 #Sequoia

应用程序 openpgp-ca

OpenPGP CA是一个用于管理和认证OpenPGP密钥的工具

9个不稳定版本

0.14.0 2024年7月10日
0.13.1 2024年1月27日
0.13.0 2023年8月18日
0.13.0-alpha.12023年4月23日
0.10.1 2021年5月7日

#207 in 加密学

Download history 98/week @ 2024-07-08 9/week @ 2024-07-15

107 每月下载次数

GPL-3.0-or-later

265KB
5.5K SLoC

什么是OpenPGP CA?

OpenPGP CA(认证机构)是一个用于处理群组或组织中的OpenPGP密钥的工具 - 它使得用户的OpenPGP体验更加简单和安全。

想象一下:Carol是她小组的技术专家。保护小组通信的需求已经出现,他们正在考虑如何改进。Carol了解OpenPGP。实际上,她不仅自己使用了OpenPGP,还在几个加密派对上提供了帮助。因此,她知道:即使是那些担心安全性的普通用户,使用OpenPGP的安全性也很困难;有太多的细节需要关注。

这就是OpenPGP CA发挥作用的地方。Carol小组的成员信任她。她已经是他们的系统管理员。因此,Carol作为她小组的认证机构(CA)是合理的。这正是OpenPGP CA帮助Carol做的。使用OpenPGP CA,只有Carol需要验证指纹。用户需要学会识别消息是否已验证,以及如何确保启用加密。然而,用户不需要验证他们通信伙伴的指纹,因为CA(由Carol运营)代表他们执行这项任务。这显著降低了正确使用OpenPGP的门槛,这给了Carol和她的同事们安全通信的机会。

设置您的OpenPGP CA实例

OpenPGP CA是一个灵活的工具,旨在与各种环境有效集成。有很多方法可以使OpenPGP CA为您服务。这里,我们展示一个典型的流程。请阅读我们的文档以获取更多详细信息,或者如果您不确定OpenPGP CA是否适合您的用例,请联系我们

安装OpenPGP CA

要为您组织运行一个OpenPGP CA实例,首先,您需要在您的机器上安装oca工具。

目前,您可以在机器上构建OpenPGP CA,以容器镜像形式运行它,或者将其部署到Kubernetes集群中。

初始化您的CA

然后您可以为您的组织创建一个OpenPGP CA实例。

$ oca -d example.oca ca init --domain example.org softkey

在此初始化步骤中,OpenPGP CA为您的CA创建一个OpenPGP密钥。密钥的用户ID设置为openpgp-ca@example.org(您应确保CA的电子邮件地址已在您的电子邮件设置中配置,以便将邮件转发给您)。

参数-d <filename>指定OpenPGP CA将存储CA信息的位置。在softkey模式下,这包括您的CA的私有OpenPGP密钥以及您的组织成员的公钥。在此示例中,我们使用文件example.oca作为我们CA数据的存储。

管理CA中的用户密钥

一旦CA设置完成,用户可以向Carol提供他们的公钥,这样她就可以在他们自己的OpenPGP CA实例中跟踪组密钥

许多用户将拥有他们希望继续使用的现有OpenPGP密钥,其他人则会在自己的计算机上创建新的密钥(可能需要在Carol的指导下)。

在有些情况下,可以使用OpenPGP CA集中生成用户密钥,但这不是本文要讨论的内容。

假设Carol想要在CA中导入同事Alice和Bob的公钥。她获取了他们的公钥副本,并将它们临时存储在文件alice.pubbob.pub中。Carol可以通过多种方式获取公钥:Alice和Bob可能通过USB存储将他们的密钥交给Carol,通过电子邮件发送给他们,或者Carol可能从公钥服务器中获取它们。

然而,在继续之前,Carol有责任验证密钥的指纹。也就是说,她需要确保她获得的密钥的指纹与Alice和Bob在他们的机器上的密钥指纹相匹配。一种典型的方法是Carol与Alice和Bob会面并读出和比较指纹。不同的组织会遵循不同的程序。关键是Carol需要确保她没有获取错误的密钥(无论是从恶意第三方那里还是因为错误,例如从一个公钥服务器中获取Bob的旧密钥,Bob已经无法访问私钥材料)。

一旦Carol获取并验证了密钥,她就可以将它们导入组OpenPGP CA实例。CA将根据Carol的验证对用户密钥进行认证,基于这些认证,组织中的每个人都可以依赖于获得正确的密钥,而不必亲自验证每个密钥。通常,用户只需要验证CA的密钥。

要将密钥导入CA,Carol将执行以下步骤

oca -d example.oca user import -e alice@example.org --key-file alice.pub
oca -d example.oca user import -e bob@example.org -e bob.baker.39472384@gmail.com --key-file bob.pub

(回忆一下-d example.oca指定了您的CA数据库的位置,在此示例工作流程中 - 在您的设置中,您可以在您的环境中配置您的CA数据库并省略此参数)

注意,在导入密钥时,Carol明确提供了Alice和Bob的电子邮件地址。

通过指定这些电子邮件地址,Carol指示OpenPGP CA实例知道哪些电子邮件地址Carol认为与每个密钥适当关联。在本例中,Carol指示CA对以下身份进行认证(使用数字签名):alice@example.org,并确保其与alice.pub中的密钥正确关联。

Alice和Bob的密钥可能包含Carol选择不与CA认证的用户ID。例如,因为那些用户ID指定的电子邮件地址与小组的共同目标无关。或者因为Carol无法验证那些数字身份,因此选择不进行认证。

使用WKD简化密钥发现

OpenPGP CA还可以显著简化密钥发现:一旦您使用OpenPGP CA管理密钥,您就可以自动输出密钥,作为Web密钥目录(WKD)

要发布您的CA作为WKD,您可以导出您域的所有公钥,如下所示

oca -d example.oca wkd export /tmp/wkd/

当您使用主机名openpgpkey.example.org(注意您还需要配置https)提供此目录的内容时,您的OpenPGP密钥将方便地可供公众访问。大多数客户端软件都可以从WKD检索密钥,并且会自动找到您的WKD。

但是,请注意,此方法仅适用于具有您域(例如example.org)用户ID的密钥。因为WKD依赖于域名系统(DNS)进行查找,您无法通过WKD发布仅具有域外用户ID的密钥。

用户可以依赖CA进行认证

OpenPGP CA的主要目标之一是让最终用户能够轻松地使用密钥与主要通信伙伴进行通信,而无需手动验证每个密钥。通过依赖CA,用户将密钥的检查委托给一个他们明确信任的实体。

当依赖CA时,组内的用户会立即看到彼此的密钥已经认证——一旦他们的OpenPGP实现获得了其他用户的密钥副本,他们就可以确信他们已经获得了正确的密钥。

用户再也不需要手动检查组员的指纹(或为彼此的密钥签名)。相反,他们依赖Carol为他们执行验证任务——并且Carol将由此产生的知识正式化为由小组CA进行的认证。

这意味着,例如,Thunderbird/Enigmail将为来自OpenPGP CA管理员认证的联系人的接收电子邮件显示绿色标题栏。因此,当Alice收到来自Bob的电子邮件时,她的电子邮件软件中会有视觉确认,表明Bob用于签名电子邮件的密钥已被验证为Bob的密钥。

使用GnuPG依赖您的CA

为了利用CA,用户需要获取并验证CA的密钥,并告诉他们的OpenPGP软件依赖该CA。"依赖CA"意味着用户需要为CA密钥发出信任签名——通过这样做,他们指示他们的OpenPGP软件他们想要利用CA进行的认证。

用户可以将他们的GnuPG安装配置为依赖CA如下。首先,用户通过WKD检索CA的密钥,然后他们设置一个本地信任签名(tlsign)并确保他们使用的CA指纹是正确的(他们需要从Carol那里获得正确的指纹——例如,以打印形式或电话通话形式)

$ gpg --locate-external-keys --auto-key-locate wkd [email protected]
$ gpg --edit-key '1234 5678 9ABC DEF0 1234  5678 9ABC DEF0 1234 5678'
gpg> tlsign
gpg> 2
gpg> 1
gpg> example.org
y
gpg> save

(如上所示的指纹 1234 5678 9ABC DEF0 1234 5678 9ABC DEF0 1234 5678 需要替换为您的CA密钥的正确指纹)

通过提供 example.org 作为域名限制,我们告诉我们的GnuPG安装只依赖CA对您域名 example.org 中的身份认证进行认证(根据您的组织性质,可能更适合配置不受限制的信任签名)。

基于我们的CA进行认证测试

任何已将OpenPGP环境配置为依赖于上述CA的人将自动将我们的用户密钥视为“受信任”

$ gpg --locate-external-keys --auto-key-locate wkd [email protected]

[..]
uid           [  full  ] Alice <[email protected]>
[..]

使用OpenPGP CA的组织之间的联盟

OpenPGP CA不仅使组织内部用户之间的认证变得简单,还支持在组织之间创建所谓的桥梁。在这种情况下,使用OpenPGP CA的组织的CA管理员使用具有范围信任签名的签名互相签署各自的CA密钥。

有关桥梁如何在组织之间进行认证的详细信息,请参阅我们的背景文档中的相关部分 https://openpgp-ca.org/background/details/

运行由OpenPGP卡支持的CA

作为操作的高级替代模式,您可以初始化您的CA实例以使用一个 OpenPGP卡 设备(例如 Gnuk、Nitrokey或YubiKey)进行所有需要私钥材料操作。与软密钥模式相比,这种模式的优势是您的CA的私钥材料无法直接访问运行CA的计算机(因此,在攻击情况下无法泄露)。

要初始化OpenPGP卡以与OpenPGP CA一起使用,该卡需要处于空白状态。新购买的卡即可使用。要使用在不同上下文中已使用过的卡,您需要首先将其工厂重置(例如,使用opgpcard 工具:opgpcard factory-reset -c <ident>)。

在设置卡的过程中,OpenPGP CA将用户PIN设置为随机的8位数字(管理员PIN设置为相同的数字)。新PIN在CA初始化后打印出来。该PIN还存储在CA数据库中(PIN在常规CA操作期间自动提供给卡)。您还可以在 oca -d <database> ca show 的输出中检查PIN。

目前,OpenPGP CA的默认密钥类型是RSA 4096。大多数现代卡都支持此类密钥。

一旦在卡模式下初始化了CA,所有CA操作都与软密钥模式下的CA操作完全一样。

初始化新的卡支持的CA实例

要创建一个由OpenPGP卡支持的新的OpenPGP CA实例,请运行

$ oca -d example.oca ca init --domain example.org card

如果系统连接了恰好一张空白卡,OpenPGP CA将自动选择要使用的卡。否则,您可以通过身份参数显式选择一张卡(如 0123:01234567)。

此命令在您的宿主机上生成CA密钥材料,并将其导入OpenPGP卡。CA的私钥材料打印到控制台,但不会以其他方式存储。

对于生产环境中的CA,您可能希望将此私钥复制到安全的地方,并保持足够的信心。您应该在空气隔离系统中执行此初始化步骤。

最后,初始化过程显示了您新设置的CA的状态信息。

Initialized OpenPGP CA instance:

    CA Domain: example.org
  Fingerprint: E8A8E047F61B2C3C011F7AA245776DAE2FE0E255
Creation time: 2022-11-22 13:49:23 UTC
   CA Backend: OpenPGP card 0123:01234567 [User PIN 14199138]

最后一行显示,该CA使用卡后端,并显示了为新卡设置的新的用户PIN(管理员PIN设置为相同的值)。

了解更多

要深入了解OpenPGP CA背后的理念,您可以阅读我们关于背景和概念的文档。

或者您还可以阅读我们关于如何运行OpenPGP CA实例的实践文档。

最终用户可以通过阅读我们的客户端文档来了解如何利用现有的CA。

版本历史

  • openpgp-ca 0.12
    • 添加了对OpenPGP卡后端操作的支持
    • 二进制程序已重命名为oca(为了简洁,之前二进制文件名为openpgp-ca

联系以获取支持

如果您有兴趣在您的组织中部署OpenPGP CA,请联系[email protected] (68C8B3725276BEBB3EEA0E208ACFC41124CCB82E)。我们可以提供咨询、帮助您设置,甚至添加功能。

对于非营利组织,可以提供优惠价格。这也是公司支持项目的有用方式。

依赖关系

~70MB
~1M SLoC