我想要一个 GnuPG 身份,我既可以长时间使用(这样我就可以建立广泛的信任网络),也可以立即与尽可能多的人一起使用。到目前为止,第二个目标最好使用 RSA(或 DSA)密钥来实现,因为即使是非常旧的 GnuPG 版本也支持它。但是,关于第一个长期目标,我个人更倾向于使用 ECC 密钥。因此,为了实现这两个目标,我的想法是同时维护一个 RSA 和一个 ECC 密钥(具有相同的 UID),并在对 ECC 的支持足够广泛时让前者过期。
在主密钥级别,这应该没有问题:我可以将每个密钥与另一个交叉签名,这样一个密钥上的签名也有助于另一个密钥的信任网络。如果联系人同时支持这两个密钥,则他们可以签署这两个密钥,或者如果他们还不能处理 ECC,则只签署 RSA 密钥。
为了便于使用,我希望只有一组子密钥,因为我想将它们存储在一张智能卡上。因此,我的想法是在两个主密钥之间共享同一组子密钥。这应该允许我使用一组子密钥对两个主密钥进行解密、签名和身份验证,这将避免为每次通信交换选择正确密钥的麻烦。
问:我共享子键的想法是否合理且可行,或者我是否忽略了 GnuPG 的一些设计方面,这些方面阻止了这种情况或引发了实际问题?
据我在技术上的理解,使密钥成为子密钥的原因基本上是主密钥的证书,它属于主密钥。这样的证书(或签名)可以从密钥中提取
gpg --export-secret-keys <your keyid> | gpgsplit
我发现一篇很老的帖子描述了将子密钥导入现有主密钥,但无法将其应用于我的目的,因为我不知道如何手动为子密钥不是最初的主密钥颁发“子密钥证书”创建的。
更具体地说,我使用上面的命令将每个键导出并分解到一个目录中。key1/000004-007.secret_subkey
然后,我分别拥有 和 中第一个密钥的子密钥和“子密钥证书” key1/000005-002.sig
。要将这个子密钥导入第二个主密钥,我尝试了以下三种方法,将结果与
cat key2/* > key2/key.gpg
gpg --import key2/key.gpg
在每种方法之后:
不加修改地复制子密钥(即
cp key1/000004-007.secret_subkey key2/
),希望 GnuPG 会问我是否应该在导入时颁发证书。除了1,不加修改地复制证书(即,
cp key1/00000{4-007.secret_subkey,5-002.sig} key2/
),希望GnuPG会问我是否应该通过第二个密钥颁发的一个来替换第一个密钥的证书。除了2,修改证书,将第一个密钥的指纹替换为第二个密钥的指纹,希望GnuPG会丢弃伪造的证书并询问我是否应该签发一个有效的证书。
在所有情况下,在导入之前,第一把钥匙和第二把钥匙都不在我的钥匙圈中。结果总是一样的,但是:
gpg: key 0x<id of key2>: secret key imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: secret keys read: 1
gpg: secret keys imported: 1
gpg: secret keys unchanged: 1
Q : 如何为具有第二个主密钥的子密钥颁发有效证书,以便我可以将子密钥导入此主密钥?