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

Ksh*_*rma 18 linux encryption gnupg

我需要自动化部署过程,该工具将自动签署发布工件。我的钥匙圈有一个主键,我只用它来创建子键和两个子键。一个用于签名的子密钥和一个用于加密的子密钥。

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

所以我想我会通过执行以下操作为子项设置不同的密码短语:

$ gpg --edit-key [subkey-id]
gpg> passwd
gpg> save
Run Code Online (Sandbox Code Playgroud)

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

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

Jen*_*rat 19

GnuPG 无法为子密钥设置单独的密码短语。但是有一个解决方法,在这种情况下它甚至看起来是一个很好的实践想法:

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

    gpg --export-secret-subkeys 0xDEADBEEF! >subkeys.pgp
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 将子项导入到另一个 GnuPG 主目录。该示例期望您位于项目根目录中,并且etc在那里有一个用于存放钥匙圈之类东西的文件夹。

    gpg --homedir ./etc/gnupg --import subkeys.pgp
    
    Run Code Online (Sandbox Code Playgroud)
  3. 更改分隔子项的密码。

    gpg --homedir ./etc/gnupg --edit-key 0xDEADBEEF
    
    Run Code Online (Sandbox Code Playgroud)
  4. 不要使用你的“普通”密钥环,总是参考上面提到的单独的 GnuPG 目录。

作为替代方案,您可能需要考虑创建一个用您自己的密钥签名的项目密钥。这可能具有其他贡献者/用户也可以签署密钥的优势(从而证明这确实是用于项目的密钥),并且在其他人将接管维护的情况下移交项目可能会更容易。

  • 这不适用于 GnuPG 2.2.4。它没有说“需要密钥才能执行此操作”。非常难过:'( (2认同)
  • 刚刚回来看到我的评论。事实证明,即使主人有错误,它仍然有效。 (2认同)

Cra*_*cks 8

一个非常过时的(2013 年)gnupg.org 邮件存档解释了为 subkey 制作单独密码的尴尬解决方法
这意味着约束不在密钥集(即主子密钥分组)的数据结构内,而仅在用于构造和修改密钥集的软件接口中。

引用自参考:

你好,

是否可以拥有一个主密钥和几个子密钥,其中子密钥的密码与主密钥不同(例如更短)?

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

但是 GnuPG 不直接支持这一点。

1) 导出密钥 (--export-secret-keys without --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 combine mv a/000001* a/000002* a/000003* combine/ mv b/000004* b/000005* combine/cd combine/ cat * > different_passphrases.gpg

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

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

豪克拉格

我还没有亲自确认这个操作——只是报告我所阅读的内容。

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


m41*_*10c 6

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

问题:我想要主密钥有一个单独密码,我仅使用它来验证/创建[C]其他子密钥以及附加的子密钥[S,E,A]。

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

我所做的是通过发出以下命令将主密钥备份到不同的位置:

$ 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
Run Code Online (Sandbox Code Playgroud)

现在我刚刚编辑了该键:

gpg --edit-key <your-key-id>
gpg> passwd
gpg> save
Run Code Online (Sandbox Code Playgroud)

这将询问每个子密钥的密码,然后让您更改它。

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

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