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

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

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

显然我不能简单地在密钥文件中使用 ASCII 字符串,ssh-keygen <>.pub因为它是 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 函数将使用的任一格式?

答案1

好的!

所以我开始思考“简单,我明白了。”事实证明,它的意义比我想象的要多得多。

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

如果您有 OpenSSH v. 5.6 或更高版本(我的笔记本电脑上没有),您可以运行以下命令:

ssh-keygen -f key.pub -e -m pem

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

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

https://gist.github.com/1024558

答案2

假设您有 SSH 私钥id_rsa,您可以从中提取公钥,如下所示:

openssl rsa -in id_rsa -pubout -out id_rsa.pub.pem

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

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

openssl rsa -RSAPublicKey_in -in id_rsa.rsapub.pem -pubout -out id_rsa.pub.pem

答案3

您想要的格式就是所谓ssh-keygenPKCS8.因此以下命令将产生所需的输出:

ssh-keygen -f key.pub -e -m pkcs8

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''.

答案4

ssh-keygen -f path/to/id_rsa.pub -e -m pem > path/to/rsa.pem

该命令的每个部分的作用如下:

-f path/to/id_rsa.pub:指定输入文件,即现有 OpenSSH 公钥文件 (id_rsa.pub) 的路径。

-e -m pem:指定格式转换为PEM。

">" path/to/rsa.pem:将输出重定向到指定目录 (path/to/) 中名为 rsa.pem 的文件。

ssh-keygen -f id_rsa.pub -e -m pem > yourfilename.pem 

相关内容