硬件智能卡上的多个加密子密钥

信息安全 gnupg
2021-08-25 14:11:40

我创建了一个 PGP 密钥集,其中包括以下内容:

  • 仅具有签名功能的主 RSA 密钥,离线存储。
    • 多张 OpenPGP 卡,每张卡有三个 RSA 密钥:
      1. 一个加密密钥
      2. 签名密钥
      3. SSH 的身份验证密钥

我这样做的原因是,如果单个硬件卡被盗,我可以以一种不会“损坏”我剩余基础设施的方式撤销其所有证书。(当然,除了我现在需要重新加密我的加密数据以排除此密钥,并且我需要使用不同的签名子密钥重新创建持久签名,但这些事情不会损害我的身份:它们是真的很不方便。)

当然,多个加密密钥不是最好的主意,但我特别关心加密和解密备份文件,而不是电子邮件。我不确定是否有办法让电子邮件用户一次将他们的电子邮件加密到我的所有三个加密密钥,但如果它只加密到一个加密密钥,这不是世界末日(尽管真的很不方便)。

我目前面临的问题涉及尝试使用 GPG 加密密钥文件设置 LUKS 启动。我当前的设置有效,但它只允许使用其中一张卡进行解密。我的公共和秘密密钥环看起来不错,秘密密钥环包含所有智能卡的存根。如果我尝试用另一张卡解密,它会阻塞并失败,提示我插入“正确”的卡。

我的密钥文件是这样加密的:

gpg --output /keyfile.gpg --encrypt --recipient $MASTER_KEY_ID \
    --encrypt-to $ENC_SUBKEY_1! --encrypt-to $ENC_SUBKEY_2! \
    --encrypt-to $ENC_SUBKEY_3!

请注意我是如何!用来强制它专门为这些子密钥加密的。在使用 cryptsetup 启动时,如果插入了不同的卡,我会看到以下消息:

gpg: error reading application data
gpg: decryption failed: secret key not available
cryptsetup: cryptsetup failed, bad password or options?

如果我使用包含 的卡$ENC_SUBKEY_1,解密工作并且操作系统启动。

我的密钥脚本与 cryptsetup 提供的非常接近:

if ! /lib/cryptsetup/askpass "Enter passphrase for key $1: " \
    /usr/bin/gpg -q --batch --no-random-seed-file --homedir /lib/cryptsetup/gpg \
        --ignore-valid-from --ignore-time-conflict --passphrase-fd 0 --decrypt $1; then
    return 1
fi

return 0

如果我在正在运行的操作系统中对文件进行相同类型的加密,当我尝试使用传递的第一个密钥以外的密钥进行解密时,我会得到一个有趣的输出--encrypt-to

Please remove the current card and insert the one with serial number:
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Hit return when ready or enter 'c' to cancel

如果我最多点击 c 两次,它最终会“找到”正确的密钥并解密文件。大概是因为它--batch在启动时处于模式,它不会提示,而是会失败。

有没有办法绕过这个问题?有没有办法让 GPG 继续尝试直到没有任何效果?即:卡1的密钥可以解密;卡 1 不存在;卡2的密钥可以解密;卡不存在;卡3的密钥可以解密;有卡;解密。

2个回答

问题是,所有三张卡的“存根”密钥都存储在您的计算机中,而 GnuPG 正在尝试所有这些。

可悲的是,我不知道定义固定解密子密钥的选项,浏览 GnuPG 的手册页也没有发现任何内容。

据我所知,您唯一的选择是从钥匙串中删除除当前使用的加密子密钥之外的所有子密钥,并在必要时切换钥匙串。请注意,在 GnuPG 2.1 之前,合并子键是一件很痛苦的事情,因此请务必保留一个包含所有子键的密钥环。

规范的方法似乎是拥有一个且唯一的活动加密密钥。引用手册:

最后,只有在密钥环上有一个有效的加密子密钥才有意义。拥有两个或更多活动子密钥不会获得额外的安全性。当然,密钥环上可能有任意数量的过期密钥,因此过去加密的文档仍然可以解密,但在任何给定时间只需要一个子密钥处于活动状态。

还有一个命令可以禁用当前未使用的键。

否则,正确的做法是禁用和/或存档所有其他密钥,可能在所有卡上保留唯一一个加密密钥。