如何将 ssh-keygen 公钥转换为 openssl PEM_read_bio_RSA_PUBKEY() 函数将使用的格式?

Pet*_*teP 68 openssh openssl

我在生成 opensslPEM_read_bio_RSA_PUBKEY()函数可以使用的公钥时遇到问题。我不断收到错误。

显然我不能简单地在ssh-keygen <>.pub密钥文件中使用 ASCII 字符串,因为它是 SSH 文件格式,或者我可能是SubjectPublicKeyInfo结构。

这是密钥生成代码: ssh-keygen -t rsa -b 1024 -C "Test Key"

我在网络上的 php 中找到了一个转换器,它将公钥的内容转换为 base64 PEM ASCII 字符串格式。然而,该功能仍然不喜欢它。

Openssl 文档指出:

  1. “使用 EVP_PKEY 结构处理公钥的 RSA_PUBKEY() 函数”
  2. “RSA_PUBKEY 函数也使用 RSA 结构处理 RSA 公钥”

如何将我的 OpenSSH 公钥转换为 OpenSSL 函数将使用它的任一格式?

Bri*_*ard 74

好的!

所以我走进了这个想法“很容易,我明白了。” 事实证明,它比我想象的要多得多。

所以第一个问题是(根据 OpenSSL (man 3 pem) 的手册页),OpenSSL 期望 RSA 密钥采用 PKCS#1 格式。显然这不是 ssh-keygen 正在使用的。您有两个选择(通过四处搜索)。

如果你有 OpenSSH v. 5.6 或更高版本(我没有在我的笔记本电脑上),你可以运行这个:

ssh-keygen -f key.pub -e -m pem
Run Code Online (Sandbox Code Playgroud)

这样做的更长的方法是将您的 SSH 密钥分解成它的各种组件(我发现其中的一些博客条目指责 OpenSSH 是“专有的”,我更喜欢称其为“独特的”),然后使用 ASN1 库交换东西。

幸运的是,有人编写了代码来执行此操作:

https://gist.github.com/1024558

  • `ssh-keygen` 方法似乎适用于 Linux,但不适用于 Mac OS X。 (12认同)
  • 盖子,请参阅有关 SSH 版本的答案中的注释。OS X 不提供最新版本的 OpenSSH。运行命令`ssh -V`。 (3认同)
  • 不适用于 `OpenSSH_6.2p2`。在`OpenSSH_6.6p1` 中有效。 (3认同)
  • 在 mac 上对我有用! (2认同)

小智 28

假设您有 SSH 私钥id_rsa,您可以像这样从中提取公钥:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem
Run Code Online (Sandbox Code Playgroud)

我意识到 OP 询问了转换公钥的问题,所以这并不能完全回答这个问题,但是我认为无论如何它都会对某些人有用。

另请注意,此命令会生成 PEM 公钥格式,这通常是 OpenSSL 所期望的。另一方面,Brian 的回答会生成一个 RSAPublicKey 格式的文件,这不是 OpenSSL 所期望的正常格式(尽管后来的版本显然可以通过-RSAPublicKey_in标志读取它)。要转换,您可以执行以下操作:

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem
Run Code Online (Sandbox Code Playgroud)


小智 21

您想要的格式是ssh-keygen调用PKCS8. 因此,以下命令将产生所需的输出:

ssh-keygen -f key.pub -e -m pkcs8
Run Code Online (Sandbox Code Playgroud)

ssh-keygen手册页:

-m key_format
         Specify a key format for the -i (import) or -e (export) conversion 
         options.  The supported key formats are: 
         ``RFC4716'' (RFC 4716/SSH2 public or private key), 
         ``PKCS8'' (PEM PKCS8 public key) or 
         ``PEM'' (PEM public key).  
         The default conversion format is ``RFC4716''.
Run Code Online (Sandbox Code Playgroud)


l3e*_*u1f 7

类似于下面 Amal Chaudhuri 的方法,这对我有用。我需要从为 SFTP 客户端 (Cyber​​duck) 生成的 ssh 公钥创建一个 pem 文件。

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于私钥 RSA 密钥,而不适用于 OP 要求的公钥。所以回答错了。 (5认同)
  • 实际上,`id_rsa` 已经是正确的格式,你可以自己检查一下,结果 `id_rsa.pem` 是 100% 相同的。 (3认同)