我试图弄清楚如何安全地使用 PGP,但关于这个问题的连贯而有用的信息却出奇地难找。
因此,SKS 密钥服务器提供他们的 HKPS 证书以及这些信息:
- 证书下载关联
- OpenPGP签名下载关联
- CRL 下载关联(证书撤销列表??)
- 证书指纹:
79:1B:27:A3:8E:66:7F:80:27:81:4D:4E:68:E7:C4:78:A4:5D:5A:17
- X509v3 主题密钥标识符:
E4 C3 2A 09 14 67 D8 4D 52 12 4E 93 3C 13 E8 A0 8D DA B6 F3
我所拥有的只是gpg (GnuPG) 2.2.10
互联网接入。
我的问题是:
- 每条信息应该如何使用?
- 我如何确定应该从密钥服务器单独下载谁的公钥(这样我就不会只信任他们的网站)?
答案1
首先,请注意,您可以完全跳过整个过程,因为 SKS 池 CA 证书与最新的 GnuPG 发行版捆绑在一起 - 通常位于/usr/share/gnupg/sks-keyservers.netCA.pem
。
其次,请注意,使用 HKPS 并不能验证数据握住泳池边。仅有的隐私措施(防止您的整个密钥环被 --refresh-keys 泄露)。但从密钥服务器检索到的实际 PGP 密钥块仍然必须以与往常相同的方式进行验证。也就是说,您仍然必须验证每个导入密钥的指纹,或者依赖Web-of-Trust或GnuPG的tofu.db。
因此,当谈到:
我如何确定应该从密钥服务器单独下载谁的公钥(这样我就不会只信任他们的网站)?
如果有人能入侵该网站并上传假的 CA.pem,他们同样也可以上传假的 CA.pem.asc 签名。如果有人能将假公钥插入该网站,他们同样也可以将相同的密钥上传到密钥服务器。
换句话说,单独从密钥服务器下载某人的密钥并不能提供任何额外的安全性。密钥服务器不会阻止任何人以相同的名称和电子邮件上传假密钥。一切仍然归结为验证密钥的指纹或信任网验证。如果您没有指纹来验证,您可以通过询问所有者来获取一个。
(知道是什么人管理 SKS Pool,我认为技术手段是不够的。我的方法是从各种来源收集信息,例如询问其他人或查看 web.archive.org,或者在 GnuPG IRC 频道上询问(如果您信任 IRC 上的随机者)。如果您在各处都看到同一个“Kristian Fiskerstrand”,那么这个人可能就是正确的。)
如果你没有任何由于与网站所有者的现有联系形式,您唯一的选择就是相信该网站正在为您提供合法信息。(幸运的是,您与该网站的连接已通过 HTTPS 和 WebPKI 进行身份验证,因此您可以排除大多数 MITM 攻击 - 只留下服务器入侵。)
您或许可以检查 web.archive.org 上网站的不同时间快照(以查看过去几个月或几年是否使用了相同的密钥)。
每条信息应该如何使用?
证书的指纹和/或 SPKI 哈希的作用实际上与网站在下载时提供的纯 SHA1 哈希相同。(实际上,指纹只是证书的 SHA1 哈希减去其 Base64 编码。)您可以使用它们如果你信任该网站……但这样基本上就多余了,因为你从同一个网站获得了 CA 证书本身。不过,这可能会防止一些意外错误。
要查看证书的指纹(SHA1):
openssl x509 -in $file -noout -fingerprint -sha1
certtool --fingerprint < $file
cat $file | sed "/^-/d" | base64 -d | sha1sum
查看 X.509v3 主题密钥标识符需要注意以下区别:计算自己查看 SPKI 哈希值(如“其他信息”下所示),而不是仅仅查看嵌入在 X.509 扩展中的哈希值(如“扩展”下所示):
certtool -i < $file | grep -C3 "Public Key ID"
GnuPG 的 dirmngr 使用 CRL(证书吊销列表)来确保被盗用的密钥服务器证书在过期之前不能被重复使用。CRL 由 CA 签名,我认为 dirmngr 会自动下载并刷新它,因此您无需手动操作。
签名由网站所有者制作,如果您已经有其他方法来验证所有者的 PGP 密钥,则可以使用该签名来验证 CA.pem 文件。仅从同一网站下载它不会增加太多。
验证签名:
gpg --verify sks-keyservers.netCA.pem.asc