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的话它会自动拒绝来自密钥服务器的不正确的密钥。

你可以用两种方式来确认密钥指纹:

1.直接检查密钥指纹

gpg --fingerprint '<fingerprint>'

2.尝试在本地用那个指纹给一个密钥签名

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 0xlongwith-fingerprint来保证所有密钥都是显示64位长的ID且显示指纹。

在导入前检查

如果你在一个地方(比如网站上面)下载了一个密钥,你应该在导入前验证密钥指纹。

gpg --with-fingerprint <keyfile>

回到目录


我的博客使用了Disqus评论框,如果你看不到评论框,那么多半Disqus服务在你所在的地区被墙,请使用代理访问。