如何从 gpg 导出私有 SSH 子密钥?

如何从 gpg 导出私有 SSH 子密钥?

我可以使用 导出公钥gpg2 --export-ssh-key 15EDA5801C8D18FF。如何获取私有 SSH 子密钥

问这个问题这里也太复杂了

答案1

这是一个有帮助的文章用于 RSA 密钥。

提炼:

GnuPG 到 OpenSSH

首先,您需要知道 RSA 密钥的指纹。您可以使用:

gpg --list-secret-keys --keyid-format short

接下来,您可以使用 monkeyshpere 项目中分发的 openpgp2ssh 工具:

gpg --export-secret-keys (or --export-secret-subkeys) 01234567! | openpgp2ssh 01234567 > id_rsa

有几点需要注意:

01234567 must be fingerprint of a RSA key (or subkey)
gpg --export-secret-keys also accept finger print of global key (in this case, it exports all sub-keys). However, openpgp2ssh only accept finger print of an RSA key
If no arguments are provided, openpgp2ssh export RSA keys it find

您现在可以使用以下命令提取 ssh 公钥:

ssh-keygen -y -f id_rsa > id_rsa.pub

答案2

gpg --export-ssh-key首先,私钥有几十种甚至几百种格式,你无法说出你想要哪种。公钥OpenSSH 定义的格式,也为许多与 OpenSSH 兼容的东西所使用(如 Putty、Jsch、paramiko),而且你似乎对此很满意,所以我会随意猜测你想要一种 OpenSSH 可以使用的格式。如果不是,这可能行不通,你就会失败。

OpenSSH 忽略了 SSHv1 密钥(这些密钥以前有所不同,但现在早已过时)历史上对于 SSHv2,它使用与 OpenSSL 相同的私钥格式,因为它使用 OpenSSL 库代码来处理这些密钥和相关的加密操作。OpenSSL 反过来支持几种 DER 格式(这里不相关)和 8 种 PEM 格式:2 种特定于每种密钥类型(又称算法)的“旧式”格式(RSA、DSA/DSS、EC[DSA])和 2 种适用于任何(受支持的)密钥类型的“PKCS8”格式。ssh-keygen只会写入旧式格式,但它和 ssh 和 sshd 都可以读取旧式或 PKCS8。(并且由于 PKCS8 的加密形式使用了比旧式加密形式更强大的 PBE 方法,您可以找到许多 Stack Qs/As 和其他可以追溯到这个时期的网站,建议您将用于 OpenSSH 的旧式私钥转换或替换为 PKCS8 私钥以获得更好的安全性。)

然后 OpenSSH 添加了 ed25519,这是 OpenSSL 当时尚未实现的密钥类型/算法,因此他们创建了自己的私钥格式,简称为“新”格式,使用比 OpenSSL PKCS8 更强大的 PBE 方法,并且有能力的支持所有密钥类型。最初从 2014 年的 6.5 开始,默认情况下仅将此用于 ed25519,但可以通过指定 来请求其他类型-o,并且您会再次发现问答和网站推荐此格式以提高安全性。然后从 2018 年的 7.8 开始,默认情况下所有类型都使用新格式,但您可以使用 请求旧格式(ed25519 除外)-m pem

gpg支持 PGP 消息传递的程序不支持上述任何一种。但是,GnuPG 软件包还包含一个不同的程序gpgsm,它支持 S/MIME 消息传递,并且确实支持 PKCS8 格式。(以及 PKCS12 格式,OpenSSL 支持该格式,但 OpenSSH 不支持。)并且仅适用于 RSA有一个很棒的技巧,你可以将为 PGP 定义的密钥转移gpggpgsm名义上用于 S/MIME。请按照以下程序操作在这个答案中除了使用--export-secret-key-p8 --armor|-a或等效于我的光泽在这里但在第 3 步停止。PKCS8(私钥)PEM 文件可用于 OpenSSH。如果您希望对其进行加密,可以使用openssl pkey -$algopenssl pkcs8 -topk8将其转换为 PKCS8 加密,或ssh-keygen -p将其转换为 OpenSSH 新格式。

或者,正如我在后一个回答中所说,你可以用 Java 编写一个非常简单的程序来执行此操作,使用支持 PGP/gpg 格式的 BouncyCastle 库OpenSSL/PKIX/S/MIME 格式(以及其他格式)。JS/nodejs、python 和 perl 中几乎肯定有库可以做同样的事情,可能还有一些我不知道的其他语言,但我对它们并不熟悉。然而,编写程序通常被认为属于 StackOverflow 而不是 SU。

相关内容