ssh-keygen 不创建 RSA 私钥

Moo*_*oon 128 mac ssh openssl

我正在尝试创建私钥并遇到问题。

当我使用 时ssh-keygen -t rsa -b 4096 -C "your_email@example.com",我会获得以下格式的私钥。

-----BEGIN OPENSSH PRIVATE KEY-----
uTo43HGophPo5awKC8hoOz4KseENpgHDLxe5UX+amx8YrWvZCvsYRh4/wnwxijYx
...
-----END OPENSSH PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用的应用程序不接受这种情况。

我期待以下 RSA 格式的密钥。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,25737CC2C70BFABADB1B4598BD8AB9E9

uTo43HGophPo5awKC8hoOz4KseENpgHDLxe5UX+amx8YrWvZCvsYRh4/wnwxijYx
...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

如何创建正确的格式?这很奇怪,因为我拥有的所有其他 mac 都创建了正确的格式,除了我遇到问题的那个。

我在全新安装的 Mac OS Mojave 上

小智 126

我最近遇到了同样的问题(升级到 mojave 10.14.1 后),这里有两个可能的解决方案。

  • 降级您的 ssh-keygen 二进制文件(您可以轻松地从任何 linux/docker 映像获取旧版本)

或者

  • 将选项添加-m PEM到您的 ssh-keygen 命令中。例如,您可以运行ssh-keygen -m PEM -t rsa -b 4096 -C "your_email@example.com"以强制 ssh-keygen 导出为PEM格式。

这似乎是在莫哈韦当前SSH-凯基版本,默认的输出格式是RFC4716提到这里

  • 我无法编辑答案,但请注意 1. 和 2. 是独立的解决方案,而不是连续的步骤。您无需为一次性密钥生成降级。只需添加```-m PEM``` (3认同)
  • 默认的_export publickey_格式确实是rfc4716,但是Q中的格式是内部私钥格式,并且是OpenSSH的“新”格式,该格式在1999年不存在(!),并且在当前中不再描述;尝试 6.0 到 6.3。 (2认同)
  • 添加 -m PEM 解决了我在 JWT 签名时遇到的一个非常令人沮丧的问题。谢谢你!! (2认同)

小智 110

可以使用 ssh-keygen 实用程序将具有 OpenSSH 私钥格式的新密钥转换为旧的 PEM 格式。

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

没有必要为了达到这个结果而降级到旧的 OpenSSH。

  • 接受的答案中不清楚的是您不需要创建新的密钥对。您可以使用现有的密钥并使用该命令进行转换。它会覆盖文件,所以我认为最好先进行备份,以防万一。 (18认同)
  • 感谢您添加有关如何将现有私钥转换为 RSA 格式的说明。刚刚救了我的培根! (2认同)

Bre*_*ton 5

对上述答案的一些阐述为公钥和私钥提供了清晰的路径。

您可以直接将 ssh 密钥导出 (-e) 为 pem 格式:

对于您的公钥:

cd ~/.ssh
ssh-keygen -e -m PEM -f id_rsa > id_rsa.pub.pem
Run Code Online (Sandbox Code Playgroud)

对于您的私钥:

事情有点棘手,因为 ssh-keygen 只允许“就地”更改私钥文件。(即它用新文件替换您的密钥文件)。

所以你可以保留你的旧文件:

鉴于我们只是导出文件,该文件<new pass phrase>可以与您的相同<old pass phrase>(除非您想同时更改密码短语)。

cd ~/.ssh
cp id_rsa id_rsa.bak
ssh-keygen -p -P "<old pass phrase>" -N "<new pass phrase>" -m PEM -f id_rsa 
cp id_rsa id_rsa.priv.pem
cp id_rsa.bak id_rsa
Run Code Online (Sandbox Code Playgroud)

注意:将密码短语作为参数传递给 cli 应用程序是一个坏主意。

安全的方法是:

cd ~/.ssh
cp id_rsa id_rsa.bak
ssh-keygen -p  -m PEM -f id_rsa 
cp id_rsa id_rsa.priv.pem
cp id_rsa.bak id_rsa
Run Code Online (Sandbox Code Playgroud)

使用此方法,系统将提示您输入旧密码和新密码。

注意:将私钥文件转换为 .pem 后,该文件现在是明文形式,这是不好的