好吧,这有点尴尬。我花了一个多星期的时间来试图解决这个问题,答案似乎在于子键-GnuPG手册和FAQ掩盖了这个主题。
在研究什么是子密钥以及为什么使用它们代替--gen-key时,我偶然发现了这个瑰宝:http ://wiki.debian.org/subkeys 。
Debian的Wiki解释了如何使用带有子密钥的主密钥来实现选项2 (请参阅OP),并进一步说明了将主密钥存储在备份介质(例如闪存驱动器)后如何从任何系统中删除该主密钥。然后可以将子密钥分配到每个设备上的我的密钥环中。
优点:
不主要依靠密码来保护主密钥,
如果有任何系统受到威胁,则主密钥将不会立即可用(除非我愚蠢地将闪存驱动器插入电源,或将所述驱动器连接到受到破坏的系统上),
这是由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
您可以重复此操作,并根据需要创建“ RSA(仅加密)”子密钥。
现在复制$HOME/.gnupg
到您的USB驱动器。
棘手的部分到了。您需要删除私钥,不幸的是,GnuPG没有提供便捷的方法。我们需要导出子项,删除私钥,然后再导入子项。
- 导出子项:
gpg --export-secret-subkeys YOURMASTERKEYID >secret-subkeys
(选择要导出的子项中,规定的子项的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#
。
每台机器有多个子项,而所有机器只有一个子项
摘自Debian子密钥Wiki。最初在评论中指出。[改写]和强调我的。
一个人可能会想在每台计算机上拥有一个子密钥,这样您只需要交换该计算机上可能受到威胁的子密钥即可。如果在所有计算机上使用单个子密钥,则需要在所有计算机上交换[当或怀疑单个子密钥受到破坏时]。
但这仅适用于签名子项。如果您有多个加密子项,则称gpg仅对最新的加密子项进行加密,而不对所有已知且未撤销的加密子项进行加密。