我了解任何 OpenPGP 证书的有效性都基于该证书经过信任网络内的受信任方的验证。
然而,对于大多数不每天使用 GnuPG 的人来说,他们只会从keyserver.ubuntu.com
一次获取密钥,并相信它们是准确的。例如,当遵循“如何验证”指南在 Ubuntu.com 上:
gpg --keyserver hkp://keyserver.ubuntu.com --recv-keys "8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092" "C598 6B4F 1257 FFA8 6632 CBA7 4618 1433 FBB7 5451"
尽管这种沟通将会发生通过未加密的普通 HTTP,我相信我们从密钥服务器取回的证书将由密钥服务器本身签名,因此只要我们知道密钥服务器的可信证书,我们就可以信任响应。
但是,仅基于运行此命令一次,我们如何才能信任密钥服务器,因为我不相信 GnuPG 会创建文件trustdb
?GnuPG 是否有一个它信任的内置证书列表,其中包括keyserver.ubuntu.com
?如果有,我如何找到此列表来检查是否是这种情况?
如果没有这个受信任的列表,那么我的所有通信是否都有可能被同一个中间人 (MITM) 拦截?中间人会在向我提供keyserver.ubuntu.com
伪造的签名包(例如,操作系统 ISO 本身)的同时,向我提供假证书?
答案1
接收密钥的参数是两个密钥的完整指纹:
- 8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092
- C598 6B4F 1257 FFA8 6632 CBA7 4618 1433 FBB7 5451
指纹是根据公钥计算得出的(I在 Super User 上讨论 OpenPGP 密钥 ID,如果您需要更多参考)。如果收到的密钥的计算指纹与请求的指纹不匹配,GnuPG 将意识到返回了错误的密钥。换句话说:您可能不信任密钥服务器(它们由随机个人操作,可能具有恶意目的),但您不必这样做,无论如何都必须验证从密钥服务器收到的所有信息。可能的指纹范围非常非常大:即使您拥有像 NSA 等机构那样强大的计算能力,也不可能找到碰撞(另一个密钥的相同指纹)。但是,不要相信短密钥 ID。
出于同样的原因,在搜索邮件收件人或用户 ID 时,您可能不会信任密钥服务器的结果。密钥服务器操作员不仅可能返回恶意信息,而且密钥服务器根本不验证任何内容(每个人都可以为任意邮件地址上传密钥)。您始终必须自行验证密钥。GnuPG 中没有默认信任的密钥,甚至 GnuPG 维护者的密钥也是如此。如果您信任列出 Ubuntu 密钥指纹的来源,您可以对其进行签名,让 GnuPG 知道您已验证这些密钥。
还有 HKPS(HTTPs 上的 HKP),但考虑到缺少密钥服务器信息的验证,这并没有改变任何东西;引入 HKPS 只是为了让中间人无法记录您从密钥服务器检索到的密钥。