如何为 gpg 子项设置不同的密码?

如何为 gpg 子项设置不同的密码?

我需要自动化部署过程,该工具将自动对发布工件进行签名。我的密钥环有一个主密钥(我仅将其用于创建子密钥)和两个子密钥。一个子密钥用于签名,另一个用于加密。

目前所有密钥都有一个密码短语。我不想在配置文件中指定此密码短语,因为这也会给主密钥带来风险。

因此,我想通过以下方式为子项设置不同的密码:

$ gpg --edit-key [subkey-id]
gpg> passwd
gpg> save

但这也改变了其他密钥的密码。

如何为各个密钥设置单独的密码?

答案1

使用 GnuPG 无法为子密钥设置单独的密码。但有一个解决方法,在这种情况下甚至看起来像是一个好的做法:

  1. 导出所选的子项(在示例中,子项的 ID 为0xDEADBEEF)。不要忘记感叹号,它确保 GnuPG 实际与子项本身一起工作,而不是与它所属的主键一起工作!

    gpg --export-secret-subkeys 0xDEADBEEF! >subkeys.pgp
    

    子密钥将附加公有主密钥和私有主密钥“密钥存根”,但不附加私有主密钥本身。

  2. 将子密钥导入另一个 GnuPG 主目录。示例假设您位于项目根目录中,并且其中有一个etc用于存放类似密钥环的文件夹。

    gpg --homedir ./etc/gnupg --import subkeys.pgp
    
  3. 更改分离子项的密码。

    gpg --homedir ./etc/gnupg --edit-key 0xDEADBEEF
    
  4. 不要使用“普通”密钥环,而应始终参考上面提到的单独的 GnuPG 目录。

或者,您可以考虑创建一个项目密钥,并用您自己的密钥进行签名。这样做的好处是其他贡献者/用户也可以对该密钥进行签名(从而证明这确实是用于项目的密钥),而且如果其他人接管维护工作,移交项目可能会更容易。

答案2

一个非常过时的(2013)gnupg.org 邮件存档解释道为子项设置单独密码的尴尬解决方法
这意味着约束不在键集的数据结构(即主子键分组)内,而仅在构建和修改键集的软件接口内。

引用自参考文献:

你好,

是否可以有一个主密钥和多个子密钥,并且子密钥具有与主密钥不同的(例如更短)密码?

您可能正在寻找的是离线主密钥(请参阅 --export-secret- subkeys)。但答案是:是的。gpg-agent 不关心密钥的连接。它甚至会多次询问您相同的密码(针对同一密钥的不同组件)。

但 GnuPG 不直接支持这一点。

1)导出密钥(--export-secret-keys 不带--armor)

2)更改密码

3)再次导出(当然是导出到不同的文件)

4) 对两个文件(在不同的目录中)使用 gpgsplit。结果如下:

000001-005.secret_key 000002-013.user_id 000003-002.sig 000004-007.secret_subkey 000005-002.sig

5) 现在将两组的组件混合在一起:mkdir combined mv a/000001* a/000002* a/000003* combined/ mv b/000004* b/000005* combined/ cd combined/ cat * > different_passphrases.gpg

6)从 secring 中删除密钥:--delete-secret-key

7)导入新的:gpg --import different_passphrases.gpg

豪克湖

我个人并未证实这一行动——只是报告我所读到的内容。

GnuPG 文档中缺乏有关这一重要主题的规范和讨论,令人失望。

答案3

即使这个问题已经很老了,我也想分享一个我也遇到过的针对这个问题的解决方案。

问题:我想要一个单独的密码为了首要的关键,我仅将其用于验证/创建 [C] 其他子密钥,以及附加的子键[海]。

一开始,所有密钥(即主密钥和子密钥)只有一个密码。

我所做的是通过执行以下操作将主密钥备份到不同的位置:

$ gpg --list-secret-keys --with-keygrip

~/.gnupg/private-keys-v1.d/<your-keygrip>.key它向我展示了主密钥的keygrip(下面的密钥文件名)。

然后,我将该密钥文件(以及相应的撤销证书)移至不同的备份位置,并最终从中删除了密钥~/.gnupg/private-keys-v1.d/<your-keygrip>.key

(撤销证书正在~/.gnupg/openpgp-revocs.d/<your-keygrip>.rev

发布后,gpg --list-secret-keys我可以sec#在主键上看到,这表明该键不再存在:

sec#  rsa4096/0x123123123123123 2018-02-01 [C] [expires: 2019-02-01]
      Key fingerprint = 123 123 123 123 123  123 123 123 123 123

现在我刚刚编辑了该键:

gpg --edit-key <your-key-id>
gpg> passwd
gpg> save

这将要求输入每个子键的密码,然后允许您更改它。

最后,我为我的子密钥设置了一个(更简单的)密码,而我的主密钥则存储在异地,并由初始(更强的)密码保护。

编辑:请注意,这仅适用于 GnuPG 2.1 及更新版本!使用旧版 GnuPG,您必须导出所有密钥(主密钥 + 子密钥),删除它们,然后重新导入子密钥。只有从 2.1 版开始,才能单独删除主密钥!

相关内容