用 PGP 保护代码完整性(二):生成你的主密钥
在本系列文章中,我们将深度探讨如何使用 PGP 以及为工作于自由软件项目的开发者提供实用指南。在前一篇文章中,我们介绍了基本工具和概念。在本文中,我们将展示如何生成和保护你的 PGP 主密钥。
清单
- 生成一个 4096 位的 RSA 主密钥 (必要)
- 使用 paperkey 备份你的 RSA 主密钥 (必要)
- 添加所有相关的身份 (必要)
考虑事项
理解“主”(认证)密钥
在本节和下一节中,我们将讨论“主密钥”和“子密钥”。理解以下内容很重要:
- 在“主密钥”和“子密钥”之间没有技术上的区别。
- 在创建时,我们赋予每个密钥特定的能力来分配功能限制。
- 一个 PGP 密钥有四项能力
- [S] 密钥可以用于签名
- [E] 密钥可以用于加密
- [A] 密钥可以用于身份认证
- [C] 密钥可以用于认证其他密钥
- 一个密钥可能有多种能力
带有 [C] (认证)能力的密钥被认为是“主”密钥,因为它是唯一可以用来表明与其他密钥关系的密钥。只有 [C] 密钥可以被用于:
- 添加或撤销其他密钥(子密钥)的 S/E/A 能力
- 添加、更改或撤销密钥关联的身份(uid)
- 添加或更改本身或其他子密钥的到期时间
- 为了网络信任目的为其它密钥签名
在自由软件的世界里,[C] 密钥就是你的数字身份。一旦你创建该密钥,你应该格外小心地保护它并且防止它落入坏人的手中。
在你创建主密钥前
在你创建的你的主密钥前,你需要选择你的主要身份和主密码。
主要身份
身份使用邮件中发件人一栏相同格式的字符串:
Alice Engineer <alice.engineer@example.org>
你可以在任何时候创建新的身份,取消旧的,并且更改你的“主要”身份。由于主要身份在所有 GnuPG 操作中都展示,你应该选择正式的和最有可能用于 PGP 保护通信的名字和邮件地址,比如你的工作地址或者用于在项目 提交 commit 时签名的地址。
密码
密码 passphrase 专用于私钥存储在磁盘上时使用对称加密算法对其进行加密。如果你的 .gnupg
目录的内容被泄露,那么一个好的密码就是小偷能够在线假冒你的最后一道防线,这就是为什么设置一个好的密码很重要的原因。
一个强密码最好使用丰富或混合的词典的 3-4 个词,而不引用自流行来源(歌曲、书籍、口号)。由于你将相当频繁地使用该密码,所以它应当易于输入和记忆。
算法和密钥强度
尽管现在 GnuPG 已经支持椭圆曲线加密一段时间了,但我们仍坚持使用 RSA 密钥,至少较长一段时间会这样。虽然现在就可以开始使用 ED25519 密钥,但你可能会碰到无法正确处理它们的工具和硬件设备。
在后续的指南中我们说 2048 位的密钥对 RSA 公钥加密的生命周期已经足够,你可能也会好奇主密钥为什么是 4096 位。 原因很大程度是由于社会因素而非技术上的:主密钥在密钥链上是最显眼的,如果你的主密钥位数比一些和你交互的开发者的少,他们肯定会鄙视你。
生成主密钥
为了生成你的主密钥,请使用以下命令,并且将 “Alice Engineer” 替换为正确值。
$ gpg --quick-generate-key 'Alice Engineer <alice@example.org>' rsa4096 cert
这将弹出一个要求输入密码的对话框。然后,你可能需要移动鼠标或随便按一些键才能生成足够的熵,直到该命令完成。
查看命令输出,它就像这样:
pub rsa4096 2017-12-06 [C] [expires: 2019-12-06]
111122223333444455556666AAAABBBBCCCCDDDD
uid Alice Engineer <alice@example.org>
注意第二行的长字符串 —— 它是你新生成的密钥的完整指纹。密钥 ID(Key ID)可以用以下三种不同形式表达:
- 指纹 Fingerprint ,一个完整的 40 个字符的密钥标识符
- 长密钥 ID Long ,指纹的最后 16 个字符(AAAABBBBCCCCDDDD)
- 短密钥 ID Short ,指纹的最后 8 个字符(CCCCDDDD)
你应该避免使用 8 个字符的短密钥 ID,因为它们不足够唯一。
这里,我建议你打开一个文本编辑器,复制你新密钥的指纹并粘贴。你需要在接下来几步中用到它,所以将它放在旁边会很方便。
备份你的主密钥
出于灾后恢复的目的 —— 同时特别的如果你试图使用 Web of Trust 并且收集来自其他项目开发者的密钥签名 —— 你应该创建你的私钥的硬拷贝备份。万一所有其它的备份机制都失败了,这应当是最后的补救措施。
创建一个你的私钥的可打印的硬拷贝的最好方法是使用为此而写的软件 paperkey
。paperkey
在所有 Linux 发行版上可用,在 Mac 上也可以通过 brew 安装 paperkey
。
运行以下命令,用你密钥的完整指纹替换 [fpr]
:
$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt
输出将采用易于 OCR 或手动输入的格式,以防如果你需要恢复它的话。打印出该文件,然后拿支笔,并在纸的边缘写下密钥的密码。这是必要的一步,因为密钥输出仍然使用密码加密,并且如果你更改了密钥的密码,你不会记得第一次创建的密钥是什么 —— 我保证。
将打印结果和手写密码放入信封中,并存放在一个安全且保护好的地方,最好远离你家,例如银行保险库。
打印机注意事项 打印机连接到计算机的并行端口的时代已经过去了。现在他们拥有完整的操作系统,硬盘驱动器和云集成。由于我们发送给打印机的关键内容将使用密码进行加密,因此这是一项相当安全的操作,但请使用您最好的偏执判断。
添加相关身份
如果你有多个相关的邮件地址(个人、工作、开源项目等),你应该将其添加到主密钥中。你不需要为任何你不希望用于 PGP 的地址(例如,可能不是你的校友地址)这样做。
该命令是(用你完整的密钥指纹替换 [fpr]
):
$ gpg --quick-add-uid [fpr] 'Alice Engineer <allie@example.net>'
你可以查看你已经使用的 UID:
$ gpg --list-key [fpr] | grep ^uid
选择主 UID
GnuPG 将会把你最近添加的 UID 作为你的主 UID,如果这与你想的不同,你应该改回来:
$ gpg --quick-set-primary-uid [fpr] 'Alice Engineer <alice@example.org>'
下次,我们将介绍如何生成 PGP 子密钥,它是你实际用于日常工作的密钥。
通过 Linux 基金会和 edX 的免费“Introduction to Linux” 课程了解关于 Linux 的更多信息。
作者:KONSTANTIN RYABITSEV 译者:kimii 校对:wxy