如何将 RSA SSH 密钥导入 GPG 作为主要私钥?

如何将 RSA SSH 密钥导入 GPG 作为主要私钥?

我目前有一个使用了一段时间的 SSH 密钥,我想开始使用带有新密钥环的 GnuPG。但是,考虑到我已经使用密钥很长时间了,我仍然希望在 GPG 中将该密钥用作主密钥。我尝试通过以下方式导入密钥这些说明

但是,我最终得到的是被认为是“子密钥”的东西。此外,如果我尝试在不创建标准 GPG 密钥的情况下导入它,GPG 甚至看不到这个子密钥。(我假设子密钥需要先由主密钥签名。)

如何将此密钥用作 secring.gpg 中的主密钥?

答案1

简单的答案是:你不知道。

SSH 密钥和 GnuPG(实际上是 OpenPGP)密钥完全不同,即使两种协议都可以使用 RSA 密钥对。

此外,你为什么想这么做?即使您使用相同的密钥材料来制作 PGP 密钥,您仍然需要将密钥作为 PGP 密钥分发。您可能还没有将 SSH 公钥分发给您的通信对象,因此从密钥分发的角度来看,这没有区别:他们需要从您那里收到公钥。即使您已经将 SSH 公钥分发给其他人,他们也需要采取一些额外的步骤才能将其导入他们的 OpenPGP 实现,这可能很容易,也可能不容易。

作为卡斯帕德非常正确地指出,必须只有一种方法来解释(特别是)签名。如果你要使用相同的密钥对于 PGP 和 SSH,如果有人能诱骗你在其中一个系统中签署特制的消息(这是某些签名系统攻击中的假定能力),那么即使两个系统都是安全的,也可能以在其中一个系统中具有某种含义的方式制作这样的消息,但不同的含义而另一方则不然。这本身就是一个弱点。(可被利用?谁知道呢。但为什么要冒这个险呢?)

PGP 和 SSH 密钥对都是长期密钥,用于保护临时(消息和会话)对称密钥,以及验证远程方的真实性。这使得 PGP 或 SSH 私钥成为攻击者比相应的对称密钥更有价值的目标。如果您对两者使用相同的密钥材料,并且攻击者能够意识到这一点,那么它只会增加对该密钥对进行成功攻击的价值。

在不详细研究这两种协议的情况下,我认为认识到两种协议中使用相同的密钥材料可能相当简单,因为公钥基本上是以明文形式传输的。

只需生成一个新的 PGP 密钥。如果您愿意,请将其设为 RSA 并且长度与您的 SSH 密钥相同。(无论如何,没有一个理智的人会比验证指纹更仔细地查看它。)然后将公钥作为 PGP 密钥分发给您希望与之通信的人。这对每个人来说都更容易,而且很可能更安全,但代价是系统随机熵池中的少量熵应该会很快得到补充。


如果你有您的秘密钥匙圈上有多个钥匙并想要指定默认使用哪一个,请使用~/.gnupg/gnupg.conf 中的default-key和可能的指令。default-recipient{,-self}

答案2

你可以使用该工具将 SSH 密钥转换为 OpenPGP 密钥pem2openpgp来自monkeysphere 项目。然后,gnupg 可以将该密钥作为常规私钥/公钥对导入。正如另一个答案所提到的,这通常不是一个好主意,因为 ssh 没有证书的概念,因此您实际上是在为现有密钥添加以前不可能具有的功能。这在密码学中通常是行不通的。

无论如何,我使用我的一个 ssh 密钥执行了此操作,但我将密钥对添加到我的另一个 OpenPGP 密钥中,作为只有一个功能标志的子密钥:身份验证。此标志适用于以下情况:您不想使用密钥对(gnupg 的含义--encrypt--sign选项)对任何内容进行签名或加密,但无论如何都希望将其放在密钥箱中,以便使用 OpenSSH 和 gnupg-agent 进行身份验证。

有关更多详细信息,请参阅 monkeysphere 文档。

答案3

将常规 PKCS 格式的密钥转换为可导入 gpg 是有充分理由的。

例如,如果您想将其放在智能卡上。 gpg 提供的 card-info 和 card-edit 命令功能对此非常有用,那么为什么不将其用作工具呢? 唯一需要克服的障碍是……确切地说:将密钥从标准 PKCS#8 格式(或“原始”RSA PKCS#1 格式)导入 gpg 密钥存储区以进行进一步处理。

所以 - 请注意我对已批准答案的反对意见!:)

对这类问题的一个真正有用的答案在这里: https://unix.stackexchange.com/questions/276317/how-can-i-import-a-key-in-pem-format-not-openpgp-into-gpg

答案4

在 Ubuntu 16.04 或 Windows WSL 上使用它。

sudo apt install -y monkeysphere
cat key.pem | PEM2OPENPGP_USAGE_FLAGS=authenticate pem2openpgp "Key <[email protected]>" > key.pgp

导入卡。可以在 Windows 或 Linux 上进行。

gpg --import key.gpg

移至卡片

查找调号标识符。

gpg --list-key

将认证密钥移至卡上

gpg --edit-key FFFFFFFFFFF
keytocard

选择一个身份验证槽的号码。

你在这里已经完成了。

如果您使用的是卡,请记得从 gpg 钥匙串中删除密钥。使用上面的密钥标识符。

gpg --delete-secret-key FFFFFFFFFFF

杂项

不需要,但可能有助于获取基于文本的 pgp 格式的密钥。

gpg -a --export FFFFFF > key.asc

相关内容