GPG 密钥获取不应该使用安全连接吗?

信息安全 密码学 公钥基础设施 密钥管理 pgp
2021-09-05 04:24:14

例如,如果我运行它:

gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys 0xFBB75451

那么导入是否以安全的方式进行?我的意思是它是否只通过安全连接?(HKP?)是否会因为密钥获取不使用端到端加密+适当的身份验证(MITM攻击)而受到损害?

更新:所以我要问这个问题:当我想获取某人的公共 GPG 时,它会受到 MITM 的攻击吗?(这样攻击者就劫持了“连接”并将keyserver.ubuntu.com欺骗到他拥有的IP,并提供了一个虚假的公钥,当我用GPG检查它时,我会联系坏的GPG密钥服务器,然后看起来 GPG 密钥是有效的!)

4个回答

这取决于您对“妥协”的定义。主要关注的是隐私,parcimonie 和 tor 是解决方案,如下所述。

但首先让我们看看数据完整性。

“端到端”安全性的概念在涵盖您为数据考虑的实际应用程序时最有帮助。由于 OpenPGP HTTP 密钥服务器协议 (HKP) 移动的对象被基于公钥技术的签名所覆盖,它们可以由您的应用程序(例如 gpg)本身检查。它将确定签名是否有效,它们是否适用于其他密钥和您信任的人等(更新:因此 gpg 仅(可选)从密钥服务器获取证书,它不依赖任何密钥服务器来建立钥匙。

例如,假设您正在使用 gpg 检查电子邮件上的签名。如果 gpg 告诉您给定的密钥未知,您可以从密钥服务器获取它。也许您的邮件会告诉您密钥是已知的但不可信,因为您最终受信任的密钥到签署电子邮件的密钥(例如这个)。因此,您查看签名,并找到您认识的人信任的人的密钥,以及信任给定密钥的人并下载该密钥。如果您最终选择了一条您信任的道路,那么一切都很好。如果有人在您下载密钥时弄乱了密钥,您要么无法获得可信路径(由于密钥损坏或无用),要么(这将非常不寻常)您将获得可能或可能的另一条路径不适合你。但是,关键是您仍然必须使用 gpg 来检查路径,并自己评估信任路径的“无形资产”(您对他人及其信任的程度)理解签名等)。但是你总是必须用 PGP 来做这件事。因此,它是“端到端”的,因为它从制作签名的人到您检查签名的软件以及您配置的信任根一直受到保护,因此非常理想。

传输的安全性并不是特别重要,使用 TLS 和相关的 PKI 和证书会增加 PGP 密钥服务器基础设施的额外复杂性、成本和脆弱性,而不会提高数据完整性。如果有人弄乱了传输,他们可能会拒绝为您提供服务,或者进行网络钓鱼攻击,但无论如何您几乎总是必须处理这些问题。

参见例如(已过期,但可能仍然有用的)Internet 草案的“安全注意事项”部分:draft-shaw-openpgp-hkp-00 - The OpenPGP HTTP Keyserver Protocol (HKP)

一个更重要的数据完整性问题将是提供精心制作的“恶意软件证书”的风险,该证书可以利用 gpg 客户端中的缓冲区溢出漏洞,或类似的东西。我还没有听说过 gpg 中的任何此类漏洞,但它们发生在 SSL 上:yaSSL Certificate Processing Buffer Overflow Vulnerability - CNET这在连接到不受信任的公钥服务器有哪些固有风险?

更新:一个更成问题的问题是隐私如果您不希望人们能够看到您正在搜索的密钥,或者弄乱您的密钥传输,那么使用 TLS 将是一种替代方案。但这并不能保护您免受服务器知道您感兴趣的内容的影响。

@teris-riel 扩展了隐私问题:想象有人向您发送了一封签名然后加密的电子邮件。您的邮件客户端愉快地检索签名的密钥。埃文正在观察交通,看到钥匙飞过。现在他知道 1)您可以阅读使用他发送给的密钥加密的消息,2)您确实阅读了该特定消息,以及 3)您阅读它的大致时间。如果这种确认攻击让您担心,请使用 hkps 和 Tor 获取密钥,不要自动进行。parcimonie是一个可以解决这个问题的工具。

并且作为bash注释中的一个 parcimonie 实现: gpg --refresh-keys 向您正在使用的密钥服务器公开您的 PGP 密钥的整个列表,以及如果您使用未加密的协议(例如 HKP)窃听您的连接的任何人(这是大多数设置的默认值)。这是一件坏事。

所以使用类似parcimonie的东西。


有一些替代协议,但是为它们找到包含您想要的密钥的服务器似乎很难:

也可以看看

使用与密钥服务器的安全连接是没有意义的,因为您也不应该信任密钥服务器。

OpenPGP(GnuPG 实现的协议)中,您获得对公钥的信任,因为该密钥是由您信任的公钥的人签名的。这是递归的,因此我们的想法是从您绝对知道的密钥(基本上是您的密钥,或者您实际遇到的某个人的密钥,并在那个场合给您他的公钥)获取一个密钥链,每个签名下一个) 到您要使用的密钥。这是一种称为Web of Trust的公钥基础设施. “其他人签名的公钥”实际上是“证书”。您获取证书的方式不会影响其安全性,因为您将只使用可以验证签名的证书。因此,它们可以存储在一个不被认为特别值得信赖的公共服务器上,并且可以在没有保护的情况下以明文传输。

WoT 中的实际安全性是通过找到几个(许多)验证路径来实现的;单一路径是不够的。这是因为确定密钥K属于 Bob 并不一定意味着 Bob 签署的任何密钥K'确实属于 Bob 认为的任何人。X.509中术语(另一个 PKI 标准),WoT 就像“每个人都是证书颁发机构”。这并不奏效,因为 Bob 可能容易上当受骗,或者可能在喝完第三品脱后鲁莽地签署其他密钥。这可以通过要求一组过度定义的证书路径来缓解,即您要使用的密钥由许多不同的 Bob 签名,假设制作一个假密钥(即具有错误身份的密钥,但仍然由其他人签名)将需要攻击者过多的努力(或过多的啤酒)。

总体而言,PGP 全球 WoT 运行不佳。行之有效的方法是通过任何不安全的介质(密钥服务器、简单的电子邮件......)交换密钥,然后给密钥持有者打电话并交换“指纹”(这是密钥的哈希)。有些人将他们的公钥指纹包含在他们的名片上。基本上,无需通过 Bob 的直接认证。这就是大部分时间使用 OpenPGP 的方式,这很好。

大多数人在实际谈论PGP 证书时似乎都在谈论PGP 密钥PGP 6.5.1 文档中的密码学简介文档的第 1 章没有使用“PGP 密钥”而是“PGP 证书”的表述。)

就像 X.509 证书一样,PGP 证书的安全价值在于它的签名以及它的消费者将签名者绑定到它知道和信任的实体的能力。X.509 和 PGP 证书之间的主要区别在于 X.509 证书只能有一个签名和颁发者(因此它是层次结构的一部分),而 PGP 证书可以定期更新附加签名,断言公共之间的绑定密钥和身份。据我所知,PGP 证书总是至少是自签名的,这并不能保证太多。编辑,感谢@nealmcb)

通过安全传输机制获取证书不会增加太多(正如@nealmcb 所说)。重要的是能够使用其签名(可能通过中间体)将其链接回您认识和信任的签名者。当然,就像 X.509 一样,当你达到顶峰时,需要有一个“信念的飞跃”(或“指定的”企业信任)。

如果keyserver.ubuntu.com通过 TLS 提供其密钥(假设使用 X.509 证书),您肯定会知道您正在寻找的 PGP 证书在服务器和您之间没有被泄露(假设您信任颁发 CA 的证书) . 但是,如果您因此而信任密钥,您最终会混合使用两种模型:并不是因为密钥服务器托管 PGP 证书,它才会就您应该如何信任其内容做出任何断言。密钥服务器只是证书的存储库。

您在这里的危险来自远程位置的欺骗形式,这很可能通过 DNS 发生,而切换到 HTTPS 无济于事。

我想说,您最好的选择是定期下载,但要手动与收件人确认密钥是否正确。