我是 GnuPG 新手,正在尝试了解如何最好地使用它。我已查看为非技术人员提供 GPG/PGP 的简短、易懂的解释?,但大多数指南都是从单机的角度解释 PGP。
我想在三台计算设备上使用 GnuPG:一台 Linux PC、一台 Linux 笔记本电脑和一台 Android 手机。
基本用例是加密/解密由 IMAP 服务管理的电子邮件,因此所有设备都需要相同的私钥进行解密。
我认为我的选择是:
只需将我的所有密钥复制到每个设备上的密钥环中,并主要依靠私钥密码进行保护。
创建一个主密钥(使用 --gen-key)来代表我的身份,然后创建一个单独的一次性密钥(再次使用 --gen-key)用于加密/解密电子邮件并使用主密钥签名。前者仅驻留在我的电脑上,后者分发到每个设备。只要我的移动设备没有受到损害,那么一次性密钥仍然有效。
我可能过于偏执,把事情弄得比实际更复杂,但请你迁就我。我认为不要把鸡蛋放在一个篮子里。
万能钥匙应该是我的数字身份。围绕这个身份建立信任需要花费很多精力,我宁愿忍受偏执带来的不便,也不愿因为粗心大意而丢失钥匙,不得不围绕新的万能钥匙建立信任(也许这并不像我想象的那么糟糕,但我对此还不熟悉)。
我丢失笔记本电脑或手机的可能性比丢失 PC 的可能性更大。如果丢失 == 妥协,那么我宁愿丢失一次性密钥对(我可以撤销),也不愿丢失主密钥对。我总是可以将主密钥的信任赋予新的一次性密钥。
抱歉,这个问题太长了。:-)
总结
密码是否足以保护我的掌握跨多个设备的私钥?
我的方案 2 可行吗?我是不是做错了什么,或者可以改进吗?
如果选项 2 不是一个好主意,那么单个用户在多个设备上使用 GnuPG 时的最佳做法是什么?
答案1
嗯,这有点令人尴尬。我花了一周的时间试图解决这个问题,答案似乎在于子密钥——GnuPG 手册和常见问题解答中都略过了这个主题。
在研究什么是子键以及为什么可以使用子键代替--gen-key时,我偶然发现了这个宝贵的东西:http://wiki.debian.org/subkeys。
Debian 的 wiki 解释了如何实现选项 #2(参见原帖)使用带有子密钥的主密钥,并进一步解释如何在将主密钥存储在备份介质(例如闪存驱动器)上后将其从任何系统中删除。然后可以将子密钥分发到每个设备上的密钥环中。
优点:
不主要依靠密码来保护主密钥,
如果任何系统被入侵,主密钥不会立即可用(除非我愚蠢地将闪存驱动器插在电源上,或将所述驱动器连接到被入侵的系统),
这是 Debian 开发团队实施的一种实践。
使用 GnuPG 的子密钥功能。这似乎比在钥匙圈上放一堆松散的钥匙更有条理,对吧?
Debian Subkey Wiki 的相关部分
备份您现有的 GnuPG 文件 ($HOME/.gnupg)。妥善保管。如果在以下步骤中出现问题,您可能需要将其恢复到已知的良好位置。(注意:umask 077 将导致备份的权限受限。)
umask 077; tar -cf $HOME/gnupg-backup.tar -C $HOME .gnupg
创建一个新的子密钥用于签名。
- 查找您的密钥 ID:
gpg --list-keys yourname
gpg --edit-key YOURMASTERKEYID
- 在
gpg>
提示符下:addkey
- 这将要求您输入密码,请输入。
- 选择“RSA(仅签名)”密钥类型。
- 选择 4096(或 2048)位密钥大小是明智的。
- 选择一个到期日期(您可以比主密钥更频繁地轮换子密钥,或者在主密钥的有效期内保留它们,而无到期日期)。
- GnuPG 将(最终)创建一个密钥,但您可能必须等待它获得足够的熵才能这样做。
- 保存密钥:
save
- 查找您的密钥 ID:
如果愿意,您可以重复此操作,并创建一个“RSA(仅加密)”子密钥。
现在复制
$HOME/.gnupg
到您的 USB 驱动器。接下来是棘手的部分。您需要删除私有主密钥,但不幸的是,GnuPG 没有提供方便的方法来执行此操作。我们需要导出子密钥,删除私钥,然后再导入子密钥。
- 导出子项:(
gpg --export-secret-subkeys YOURMASTERKEYID >secret-subkeys
要选择要导出的子项,请指定子项 ID,每个 ID 后跟一个感叹号gpg --export-secret-subkeys SUBKEYID! [SUBKEYID! ..]
:) - 删除你的主密钥:
gpg --delete-secret-key YOURMASTERKEYID
- 重新导入子密钥:
gpg --import secret-subkeys
- 验证是否只
gpg -K
显示sec#
而不是 ,sec
这表示您的私钥。这意味着密钥实际上并不存在。(另请参见 的输出中是否存在虚拟 OpenPGP 数据包gpg --export-secret-key YOURMASTERKEYID | gpg --list-packets
)。 - (可选)更改保护子密钥的密码:
gpg --edit-key YOURMASTERKEYID passwd
。(请注意,备份上的私钥材料(包括私钥主密钥)仍将受旧密码保护。)
- 导出子项:(
您的计算机现在可以正常使用了。
当您需要使用主密钥时,请挂载加密的 USB 驱动器,并设置 GNUPGHOME 环境变量:
export GNUPGHOME=/media/something
gpg -K
或者使用 --home 命令行参数:
gpg --home=/media/something -K
后一个命令现在应该列出您的私钥,sec
而不是sec#
。
每台机器多个子密钥 vs. 所有机器一个子密钥
摘自 Debian 子密钥 wiki。最初在评论中注明。[释义] 和强调矿。
有人可能会倾向于每台机器都使用一个子密钥,这样你只需要交换该机器上可能被泄露的子密钥。如果所有机器都使用一个子密钥,则需要在所有机器上交换该子密钥(当该子密钥被泄露或怀疑被泄露时)。
但这只适用于签名子密钥。如果您有多个加密子密钥,据说 gpg 仅对最新的加密子密钥进行加密并且不适用于所有已知和未被撤销的加密子密钥。
答案2
作为一个不喜欢单点故障(包括主密钥和尤其密码),这就是我的做法。它允许设备通过信任网络运行,同时仍允许去中心化身份。
我不知道是否已经有现成的系统可以实现这个功能,但是我认为它可以与 cron 作业和几行 Bash 一起记录下来。
在这个系统中,您有两类密钥对:设备密钥对和时间框架密钥对。 一设备密钥对在每个设备上为用户生成,并在整个生命周期内保留在该设备上。时间框架密钥对由中央服务器定期生成(每月、每天、每小时 - 取决于您想要的严密程度)。公钥是公开发布的(服务器本身有自己的设备密钥对用于签名),私钥使用每个有权访问此密钥的设备的公钥加密分发。(此分发应尽可能保密,例如让设备直接连接到服务器。)
对于签名消息,您可以使用发送消息的设备的设备密钥。如果有人想向您发送消息,他们可以使用您当前的公共时间范围密钥对其进行签名。(他们应该有一个自动化系统来跟上公告。)然后您可以从任何设备阅读他们的消息。
为了阅读较旧的加密消息,较旧的时间范围密钥对会根据适当的策略在每个设备上备份(如果您愿意,包括时间范围密钥对生成服务器 - 同样,取决于您的偏执程度),其中您有另一组受密码保护的密钥对保护较旧的密钥(随着时间的推移,您可以使用任意数量的密码来记住它们)。
如果设备被盗或以其他方式受到入侵,您可以使用另一台公开信任的设备创建公开签名的消息来验证您的身份(无论通过何种方式,例如,注明您将参加公开聚会和/或让可信任的朋友亲自验证您的身份)并撤销被入侵的设备密钥及其有权访问的任何时间范围密钥。撤销密钥时,您还会从服务器的受信任设备列表中删除被盗设备(使用密码和您的受信任设备密钥)。
信任新发布的设备密钥的策略应该遵循类似于当前的信任策略 - 我认为适当的策略是信任生成服务器、移动设备和大而重的设备,因为在用户注意到之前,很难在协同抢劫中窃取/渗透用户的手机、台式电脑和 VPS。
如果您的服务器受到威胁,您只需按照对任何其他受到威胁的设备描述的相同程序将其撤销(可能具有类似于添加新设备的更强大的策略),然后使用重新保护或全新的服务器(使用新的设备密钥对)继续。