如何跨多个系统管理GPG密钥?


103

我是刚接触GnuPG并试图了解如何最好地使用它的人。我已经为非技术人员复习了简短易懂的GPG / PGP解释?,但大多数指南都是从单机角度解释PGP。

我想在三种计算设备上使用GnuPG:Linux PC,Linux笔记本电脑和Android手机。

基本用例是对由IMAP服务管理的电子邮件进行加密/解密,因此所有设备都需要相同的私钥进行解密。

我认为我的选择是:

  1. 只需将我的所有密钥复制到每台设备的密钥环上,并主要依靠私钥密码进行保护即可。

  2. 创建一个主密钥(使用--gen-key)来代表我的身份,然后创建一个单独的一次性密钥(同样使用--gen-key)以加密/解密电子邮件并用该主密钥签名。前者仅驻留在我的PC上,后者分布在每个设备上。只要我的移动设备没有受到破坏,那么一次性密钥就仍然有效。

我可能过于偏执,使事情变得比原来复杂得多,但是请给我幽默。我相信不要把所有的鸡蛋都放在一个篮子里。

主密钥应该是我的数字身份。将花费大量的精力来建立围绕该身份的信任,我宁愿遭受我的偏执狂带来的不便,也不愿因粗心而丢失我的密钥,而不得不围绕新的主密钥建立信任(也许这并不像我那样糟糕。想,但是我对此并不陌生

与笔记本电脑相比,我丢失笔记本电脑或手机的可能性更大。如果损失==折衷,那么我宁愿丢失一个一次性密钥对(我可以撤销),而不是主密钥对。我总是可以将我的主密钥信任给新的一次性密钥。

很抱歉这个很长的问题。:-)

TL; DR

密码是否足以保护我的私钥跨多个设备存储?

我的方案2计划可行吗?我做错了什么或可以改善吗?

如果选项2是个坏主意,那么在多个设备上为单个用户使用GnuPG时的最佳做法是什么?

Answers:


59

好吧,这有点尴尬。我花了一个多星期的时间来试图解决这个问题,答案似乎在于子键-GnuPG手册和FAQ掩盖了这个主题。

在研究什么是子密钥以及为什么使用它们代替--gen-key时,我偶然发现了这个瑰宝:http ://wiki.debian.org/subkeys 。

Debian的Wiki解释了如何使用带有子密钥的主密钥来实现选项2 (请参阅OP),并进一步说明了将主密钥存储在备份介质(例如闪存驱动器)后如何从任何系统中删除该主密钥。然后可以将子密钥分配到每个设备上的我的密钥环中。

优点:

  1. 不主要依靠密码来保护主密钥,

  2. 如果有任何系统受到威胁,则主密钥将不会立即可用(除非我愚蠢地将闪存驱动器插入电源,或将所述驱动器连接到受到破坏的系统上),

  3. 这是由Debian开发团队实施的做法。

  4. 使用GnuPG的子项功能。是的,这比在钥匙圈上有一堆松散的钥匙更有组织性,是吗?

Debian Subkey Wiki的相关部分

  1. 备份现有的GnuPG文件($ HOME / .gnupg)。确保他们安全。如果在以下步骤中出现问题,则可能需要将其返回到已知的正确位置。(注意:umask 077将导致备份的限制性权限。)

    • umask 077; tar -cf $HOME/gnupg-backup.tar -C $HOME .gnupg
  2. 创建一个新的子项进行签名。

    • 查找您的密钥ID: gpg --list-keys yourname
    • gpg --edit-key YOURMASTERKEYID
    • gpg>提示符下:addkey
    • 这会要求您输入密码,然后输入。
    • 选择“ RSA(仅签名)”密钥类型。
    • 选择4096(或2048)位密钥大小是明智的。
    • 选择一个到期日期(您可以比主密钥更频繁地旋转子密钥,或者将它们保留在主密钥的生命周期内,没有到期)。
    • GnuPG将(最终)创建一个密钥,但是您可能必须等待它获得足够的熵才能这样做。
    • 保存密钥: save
  3. 您可以重复此操作,并根据需要创建“ RSA(仅加密)”子密钥。

  4. 现在复制$HOME/.gnupg到您的USB驱动器。

  5. 棘手的部分到了。您需要删除私钥,不幸的是,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仅对最新的加密子项进行加密,而不对所有已知且未撤销的加密子进行加密。


5
好的问与答,但是AFAIK的设置仍然存在一个问题...它非常适合签名,但是如果您不想在不同设备之间共享相同的enc密钥,那么就不适合加密,因为当有人让您接收加密的邮件时消息,默认情况下,gpg使用生成的最新未吊销的enc密钥。不可能强制发送者根据UID(家庭或工作等)使用特定的enc子项。
KurzedMetal 2012年

2
也许这是一个问题。我最担心的是失去建立在主密钥(仅签名)周围的信任网络。当然,加密子项必须存在于我用来读取加密消息的所有设备上。如果我的加密密钥曾经遭到破坏,那么恢复过程将只涉及我自己。而不是丢失我的主签名密钥,而不得不要求/说服我的信任网络来签名新密钥。我无意在我的保管库中重新定位加密子项。
贾斯汀C

9

作为不喜欢单点故障(包括主密钥,尤其是密码)的人,这就是我要做的方法。它允许设备通过信任网络进行操作,同时仍然允许分散身份。

我不知道是否已经有一个用于此的系统,但是我认为它可能与cron作业和几行Bash一起使用。

在此系统中,您有两类密钥对:设备密钥对和时间范围密钥对。在每个设备上为用户生成一个设备密钥对,并在该设备的整个生命周期内保持不变。一个时间表密钥对是通过在常规间隔一个中央服务器产生的(每月,每天,每小时-取决于你想如何偏执是)。公用密钥是公开宣布的(服务器本身具有自己的设备密钥对进行签名),并且专用密钥是使用每个有权访问此密钥的设备的公用密钥加密分发的。(此分发应尽可能私有,例如,使设备直接连接到服务器。)

对于邮件签名,您可以使用发送邮件的任何设备的设备密钥。如果有人想向您发送消息,则可以使用您当前的公共时间框架密钥对其进行签名。(他们应该有一个自动系统来跟上公告。)然后,您可以从任何设备上阅读他们的消息。

为了读取较旧的加密消息,较旧的时间帧密钥对将根据适当的策略(如果需要,还包括时间帧密钥对生成服务器,视情况而定-再次取决于您的偏执程度)在每台设备上备份,在那里您需要另外一套一组受密码保护的密钥对,用于保护较旧的密钥(随着时间的流逝,您会记住很多密码,但是有很多密码)。

如果某台设备被盗或以其他方式受到破坏,则可以使用另一台公共信任的设备来创建一条公开签名的消息,以验证您的身份(通过任何方式,例如,注意您将参加公开聚会和/或让可信赖的朋友亲自验证您的身份),并撤消遭到破坏的设备密钥以及它可以访问的任何时间范围密钥。吊销密钥时,还将从服务器的受信任设备列表中删除被盗设备(带有密码和受信任设备密钥)。

信任新发布的设备密钥的策略应遵循当前的信任策略之类的策略-我认为,由于难以窃取/渗透,因此合适的策略是信任生成服务器,移动设备和大型设备。用户的电话,台式机和VPS一起抢劫,而不会引起用户注意。

如果您的服务器受到威胁,您只需按照针对其他任何受到威胁的设备所描述的相同步骤将其吊销(可能具有与添加新设备相似的更强大的策略),然后使用重新安全保护的或完全相同的新服务器(具有新设备密钥对)。


撤销部分在撰写时有些阴沉-应该可以通过其他任何设备发出的通知来撤销设备(以免有人窃取您的笔记本电脑而手机无法直接与服务器联系,以免失败)。由小偷完成(因此设备应具有受密码保护的密钥才能撤消)。如果报告冲突,则应暂时不信任所有密钥,直到可以执行第三方的手动验证为止。
Stuart P. Bentley

实际上,建议使用另一种机制来撤销密钥,即使用一个强大的公共密码,该机制会定期手动更新(替换)-这样,您可以在不依赖任何设备的情况下撤销密钥(例如只要您将密码保密,只要您的手机掉电,有人就会偷走它。
Stuart P. Bentley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.