OpenPGP 最佳实践 - 密钥服务器
配置一个密钥服务器并让你的计算机同步密钥
如果你不经常地刷新你手中的 PGP 公钥,你就没法及时地了解到十分需要关注的 PGP 公钥的过期或者撤销情况。关于密钥接受有两个步骤,许多用户会把自己的公钥上传到密钥服务器上,为了保证你能接受到这些同步,你需要先正确地配置密钥服务器。
安全地连接一个 sks 密钥服务器池而不是某台具体的服务器
很多 OpenPGP 客户端被配置了一个固定的密钥服务器,这样当服务器出现问题的时候你就有可能没法接受到重要的密钥同步,除了这种单点故障之外,这也会是一个泄漏 OpenPGP 用户之间关联信息的一个主要方式,从而成为一个被攻击的目标。
因此我们推荐使用 sks 密钥服务器池,这个池中的机器会被定期地检查运行状态,如果出现故障就会被移出这个池。
你也需要保证你是在使用 hkps 加密地与这个服务器池通讯,为了使用 hkps,你需要先安装 gnupg-curl
sudo apt-get install gnupg-curl
然后,要使用这个密钥池,你需要下载 sks-keyservers.net 的 CA 证书 并把它保存在你机器上的某处,然后你需要 验证这个 CA 的 PGP 指纹,现在你需要在 ~/.gnupg/gpg.conf
中添加两行。
keyserver hkps://hkps.pool.sks-keyservers.net
keyserver-options ca-cert-file=/path/to/CA/sks-keyservers.netCA.pem # 注意,这个证书地址就是之前下载的那个 CA 的位置
现在你与证书服务器之前的通讯就会通过 hkps,这个可以在有人嗅探你的流量的时候保护的你的社交关系。如果你使用的不是 hkps 而是 hkp 的话,当你在某个密钥服务器上 gpg --refresh-keys
的时候,嗅探你流量的人就可以看到你同步 key 的信息,有了这些信息就事情就会变得十分有趣了。
Note: hkps://keys.indymedia.org, hkps://keys.mayfirst.org and hkps://keys.riseup.net 都提供 hpks 密钥服务器(当然我们还是建议你使用一个密钥服务器池)
保证所有的密钥都是通过你选择的密钥服务器同步
当创建一个密钥对的时候,我们可以指定某一台服务器来拉取他们的 Key,我们建议你使用以下配置信息来忽略对服务器指定:
keyserver-options no-honor-keyserver-url
这样做有如下好处:
- 可以防止有人通过指定的服务器通过不安全的方式拉取密钥
- 如果指定的服务器使用了 hkps,如果对方没有下载 CA 证书的话密钥就可能永远没法被同步
需要注意的是攻击者也可以指定一个密钥服务器并且监控你是从哪儿同步了他们的密钥(注:类似 BT 种子钓鱼,可以钓出对方的 IP 地址)
慢慢同步你的密钥并且一次同步一个
现在已经配置好了一个不错的服务器池,你现在需要做的就是定期地同步你的密钥,对于 Debian 和 Ubuntu 用户来说最好的方式就是使用 parcimonie:
sudo apt-get install parcimonie
parcimonie 是一个走 Tor 的缓慢的密钥同步守护进程。它使用随机化休眠机制,并且所有同步密钥的流量都是通过 Tor. 这样会让攻击者难以通过你的手中公钥来关联到你。
你不应该使用 gpg --refresh-keys
或者邮件客户端上的刷新按钮来刷新密钥,因为这样的话密钥服务器管理员,监听者都可以知道你在刷新的密钥了。
不要盲目地相信来自密钥服务器的密钥
所有人都可以把自己的密钥上传到密钥服务器上所有你不应该仅仅是下载下密钥就盲目地认为就是你需要的那个。你用该通过线下或者电话的方式向对方确认其密钥的指纹信息。当你确定了对方的指纹后,你就可以通过如下指令下载对方的公钥:
gpg --recv-key '<fingerprint>'
下一步就是确认你下载你的密钥就是你需要的那个,密钥服务器可能会给了一个其他密钥的给你。如果你的 GnuPG 版本小于 2.1,那你就需要手动确认你下载到的 Key,如果你的 GnuPG 版本大于 2.1 的话它会自动拒绝来自密钥服务器的不正确的密钥。
你可以用两种方式来确认密钥指纹:
- 直接检查密钥指纹
gpg --fingerprint '<fingerprint>'
- 尝试在本地用那个指纹给一个密钥签名
gpg --lsign-key '<fingerprint>'
如果你确定你拿到了那个人的正确的密钥,比较建议的是在本地给那个密钥签名,如果你希望公开的表明你和那个人的联系的话,你可以公开 --sign-key
.
注意上面命令中密钥指纹只需要被单引号或者双引号包含。
不要依靠 Key ID
短的 OpenPGP ID,比如 0×2861A790,只有 32 位长,他们已经 被证明 一个其他的 Key 可以有先同的 Key ID. 长的 OpenPGP ID,比如 0xA1E6148633874A3D 有 64 位长,也是可以 被碰撞 的,所以 也是一个严重的问题
如果你需要一个强密码学保证的验证方法,你应该使用全指纹,你永远不应该以来或短或长的 Key ID.
你至少应该在 GPG 配置文件中写上 keyid-format 0xlong
和 with-fingerprint
来保证所有密钥都是显示 64 位长的 ID 且显示指纹。
在导入前检查
如果你在一个地方(比如网站上面)下载了一个密钥,你应该在导入前验证密钥指纹。
gpg --with-fingerprint <keyfile>