OpenPGP 最佳实践 - 密钥配置

你应该已经可以从一个密钥服务器上同步其他人的密钥了,现在你需要保证你的 OpenPGP 密钥已经被正确的配置.

使用一个强壮的主密钥

(注:此段有许多内容较为过时,我将选择性翻译)
在 2011 年美国 NIST放弃了 DSA-1024 加密算法.

现在推荐使用 sha512 生成的 4096 位的 RSA 密钥,并且使用双密钥签名的 密钥转移声明,并且让其他人知道你的密钥,有一份 不错的文档 写清楚了这么做的所有步骤.

转变会比较艰难,但是这样是值得的,且这也是一个最好的使用工具实践的方法.

密钥过期时间不要超过 2 年

很多人不希望他们的密钥过期,但是你真的这么认为么?密钥的过期时间可以在任意时刻(哪怕已经过期)修改. 所以过期时间更像是一个自动的定时开关,如果你在没有及时重置开关则密钥可以自动失效,这样可以让其他人知道你一直对密钥有所有和管理能力.

当然,如果设置一个过期时间的话就意味着你以后在某个时间需要延长一次,这个是一个你需要记住的微小的工作.

你可能会认为这样很烦人并且不想处理它,但是这个是一个基础的让你保持对 OpenPGP 工具熟悉的方法,它表明了你的密钥仍然在被使用着. 此外,有些人不会对一个没有过期日期的密钥签名.

假设你已经生成了一个没有过期时间的密钥,你可以通过以下指令来添加过期时间:

1
gpg --edit-key '<密钥指纹>'

现在选择一个你想设置过期时间的子密钥,并且输入 expire 指令:

1
2
gpg> key 1
gpg> expire

然后设置一个合理的过期时间并且退出(比如两年):

1
2
Key is valid for? (0) 2y
gpg> save

然后你需要把你的公钥推到密钥服务器上来宣布这次改动:

1
gpg --send-key '<密钥指纹>'

在日历上提醒你延长过期时间

你肯定记不住密钥过期时间的,所以在过期前的一两个月设置一个提示告诉你该更新过期时间了.

生成一个吊销证书

如果你忘记了你的密码或者你的私钥已经被他人获取,你唯一的希望就是等到的密钥过期(当然,这样并不是一个好的解决方法),或者把你的吊销证书推到密钥服务器上,这样可以通知到其他人你的密钥已经被吊销不再使用了.

一个被吊销的密钥仍然可以用来验证证书或者解密信息(如果你还能解开私钥的话),但是已经不能被其他人用来加密消息发送给你,使用以下指令创建一个称为 revoke.asc 的销毁证书:

1
gpg --output revoke.asc --gen-revoke '<fingerprint>'

你可能会希望把这个文件打印出来并且隐藏起来. 如果有人得到了这个,他们就可以吊销你的密钥,这样就会很不方便,但如果他们得到了你的私钥,那么吊销的密钥就十分必要了.

需要注意这个在 GnuPG 2.1 及以上会默认进行.

主密钥只用来认证(或者签名),使用一个子密钥用来加密

这个在 GnuPG 1.4.18 及以上是默认进行的.

用一个单独的子密钥来签名

默认 GnuPG 使用同一个子密钥来签名消息和给其他密钥签名. 如果使用单独的子密钥来操作的话会十分有用,因为签名消息远远比签名其他的密钥重要.

在这个情况下你的主密钥仅仅用来认证,且很少被使用.

可以使用 edit-key 来编辑,使用 addkey 来生成子密钥.

把主密钥完全放在线下

这个保护你的主密钥的方法很有技巧性. 如果你的主密钥被盗,攻击者就可以用它来创建的新的身份并且吊销你的证书,将主密钥完全放在线下可以很好的防止这类攻击.

确保你使用了单独的签名密钥,你没法使用已经被下线的主密钥给邮件签名.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 导出你的主密钥
gpg -a --export-secret-key john.doe@example.com > secret_key
# 导出所有子密钥
gpg -a --export-secret-subkeys john.doe@example.com > secret_subkeys.gpg
# 删除 keyring 上的所有私钥,这样就只有子密钥的
$ gpg --delete-secret-keys john.doe@example.com
Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y
# 重新导入你的子密钥
$ gpg --import secret_subkeys.gpg
# 确认已经导入完成
$ gpg --list-secret-keys
# 在磁盘上把子密钥删除
$ rm secret_subkeys.gpg

然后你需要保护好 secret_key 内容,比如放在一个 U 盘中,或者使用智能卡(注:比如 Yubikey)来储存密钥,设备的安全性决定了你密钥的安全性.

请确保你有吊销证书.

你可以通过 --list-secrect-keys 参数,通过判断私钥部分显示的是 sec# 而不是 sec 来确认私钥部分已经被移除.

提示:在上述操作中私钥在你的磁盘上时使用明文储存的,所以一个单独的 rm 并不能彻底删除掉,考虑使用 wipe 工具,当然,如果你使用的是 SSD 的话,操作前请确保已经上了 FDE(全盘加密),否则没法彻底删除.

回到目录


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