我创建了一个 PGP 密钥集,其中包括以下内容:
- 仅具有签名功能的主 RSA 密钥,离线存储。
- 多张 OpenPGP 卡,每张卡有三个 RSA 密钥:
- 一个加密密钥
- 签名密钥
- SSH 的身份验证密钥
- 多张 OpenPGP 卡,每张卡有三个 RSA 密钥:
我这样做的原因是,如果单个硬件卡被盗,我可以以一种不会“损坏”我剩余基础设施的方式撤销其所有证书。(当然,除了我现在需要重新加密我的加密数据以排除此密钥,并且我需要使用不同的签名子密钥重新创建持久签名,但这些事情不会损害我的身份:它们是真的很不方便。)
当然,多个加密密钥不是最好的主意,但我特别关心加密和解密备份文件,而不是电子邮件。我不确定是否有办法让电子邮件用户一次将他们的电子邮件加密到我的所有三个加密密钥,但如果它只加密到一个加密密钥,这不是世界末日(尽管真的很不方便)。
我目前面临的问题涉及尝试使用 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的密钥可以解密;有卡;解密。