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

Jus*_*n C 124 pgp gnupg

我是使用 GnuPG 的新手,并试图了解如何最好地使用它。我已经阅读了针对非技术人员的 GPG/PGP 的简短易懂的解释?,但大多数指南都是从单机角度解释 PGP 的。

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

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

我想我的选择是:

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

  2. 创建一个主密钥(使用 --gen-key)来代表我的身份,然后创建一个单独的一次性密钥(再次使用 --gen-key)用于加密/解密电子邮件并使用主密钥签名。前者只驻留在我的电脑上,后者分布在每个设备上。只要我的移动设备没有受到损害,一次性密钥就一直有效。

我可能过于偏执,让事情变得比实际情况更复杂,但请幽默我。我相信不要把所有的鸡蛋放在一个篮子里。

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

与 PC 相比,我更容易丢失笔记本电脑或手机。如果丢失 == 妥协,那么我宁愿丢失一个一次性密钥对(我可以撤销)而不是我的主密钥对。我总是可以将我的主钥匙的信任赋予新的一次性钥匙。

抱歉问了这么长的问题。:-)

TL; 博士

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

我的选项#2 计划可行吗?我做错了什么还是可以改进?

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

Jus*_*n C 78

嗯,这有点尴尬。在一周的时间里,我花了几个小时试图解决这个问题,答案似乎在于子键——GnuPG 手册和常见问题解答掩盖了这个主题。

在研究什么是子键以及为什么可以使用它们代替 --gen-key 时,我偶然发现了这个 gem: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显示 asec#而不仅仅是sec您的私钥。这意味着密钥实际上并不存在。(另请参阅 的输出中是否存在虚拟 OpenPGP 数据包gpg --export-secret-key YOURMASTERKEYID | gpg --list-packets)。
    • 或者,更改保护子密钥的密码:gpg --edit-key YOURMASTERKEYID passwd. (请注意,备份上的私钥材料,包括私钥主密钥,仍受旧密码保护。)

您的计算机现在可以正常使用了。

当您需要使用主密钥时,挂载加密的 U 盘,并设置 GNUPGHOME 环境变量:

export GNUPGHOME=/media/something
gpg -K
Run Code Online (Sandbox Code Playgroud)

或使用 --home 命令行参数:

gpg --home=/media/something -K
Run Code Online (Sandbox Code Playgroud)

后一个命令现在应该列出您的私钥,sec而不是sec#

每台机器的多个子密钥与所有机器的一个子密钥

摘自 Debian 子项 wiki。最初在评论中指出。[释义] 并强调我的。

人们可能希望每台机器都有一个子密钥,这样您只需要交换那台机器的潜在受损子密钥。如果在所有机器上使用单个子密钥,则需要在所有机器上交换它[当该单个子密钥被或怀疑被泄露时]。

但这仅适用于签署子密钥。如果您有多个加密子密钥,据说 gpg 只为最近的加密子密钥加密,而不是为所有已知和未撤销的加密子密钥加密。

  • 很好的问答,但 AFAIK 这个设置仍然存在一个问题......它非常适合签名,但如果您不想在不同设备之间共享相同的加密密钥,则不适用于加密,因为当有人让您接收加密的消息,gpg 默认使用最新生成的未撤销的 enc 密钥。无法根据 UID(家庭或工作等)强制发件人使用特定的 enc 子项。 (7认同)
  • 也许这是一个问题。我最担心的是失去围绕我的主密钥(仅签名)建立的信任网络。当然,加密子密钥必须存在于我用来阅读加密消息的所有设备上。如果我的加密密钥被泄露,那么恢复过程只涉及我自己;与丢失我的主签名密钥并不得不要求/说服我的信任网络签署新密钥相反。我不打算在我的保管库中重新定位加密子密钥。 (3认同)

Stu*_*ley 11

作为也不喜欢单点故障(包括主密钥,尤其是密码)的人,这就是我要做的。它允许设备通过信任网络运行,同时仍然允许去中心化身份。

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

在这个系统中,您有两类密钥对:设备密钥对和时间帧密钥对。在每台设备上为用户生成一个设备密钥对,并在其生命周期内保留在该设备上。一个时间表密钥对( -取决于如何偏执你想成为每月,每日,每小时)通过在常规的时间间隔在中央服务器中产生。公钥是公开公布的(服务器本身有自己的设备密钥对来签名),私钥是用每个设备的公钥加密分发的,每个设备都可以访问这个密钥。(此分发应尽可能私密,例如让设备直接连接到服务器。)

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

为了读取较旧的加密消息,根据适当的策略(包括时间帧密钥对生成服务器,如果您愿意 - 再次取决于您的偏执程度)在每个设备上备份较旧的时间范围密钥对,您还有另一组保护旧密钥的受密码保护的密钥对(随着时间的推移,您可以轻松记住多少密码)。

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

信任新公布的设备密钥的策略应该遵循类似于当前信任策略的策略——我认为合适的策略是信任生成服务器、移动设备和大型设备,因为它很难被窃取/渗透在用户注意到之前协同抢劫用户的电话、台式机和 VPS。

如果您的服务器受到威胁,您只需按照针对任何其他受感染设备所述的相同程序撤销它(可能使用类似于添加新设备的更强策略),并使用重新加密或全新的服务器(带有新设备密钥对)继续前进。