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


49

我在生成openssl PEM_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. “ RSA_PUBKEY()函数,使用EVP_PKEY结构处理公钥”
  2. “ RSA_PUBKEY函数还使用RSA结构处理RSA公钥”

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


弄清楚了:仅按以下方式使用openssl工具:
PeteP 2011年

创建私钥:openssl genrsa -out test.priv.key 2048; 以相同格式(PEM?)输出公共密钥:openssl rsa -in test.priv.key -pubout -out test.pub.key
PeteP 2011年

Answers:


56

好!

因此,我走进了这样一个想法:“容易,我明白了。” 事实证明,这还比我想的要多得多。

因此,第一个问题是(根据OpenSSL的手册页(man 3 pem)),OpenSSL期望RSA密钥为PKCS#1格式。显然,这不是ssh-keygen所使用的。您有两个选择(从周围搜索)。

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

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

较长的方法是将SSH密钥分解成各种组件(我在Blog条目中指责OpenSSH是“专有的”,我更喜欢将其称为“唯一”),然后使用ASN1库交换东西。

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

https://gist.github.com/1024558


9
ssh-keygen方法似乎是在Linux上工作,但不支持Mac OS X.

3
盖上,请参阅有关SSH版本的答案中的注释。OS X没有发布OpenSSH的最新版本。运行命令ssh -V
Brian Redbeard 2014年

3
在中无效OpenSSH_6.2p2。在中工作OpenSSH_6.6p1
2014年

-m对我不起作用...解决方法是什么?
pstanton '16

2
在Mac上对我有用!
格雷格·霍恩比

18

假设您拥有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

谢谢,私钥中的-pubout对我有用。
肖恩·杜伯瑞

openssl rsa -in id_rsa.pem -pubout -out id_rsa.pub.pem也可以工作(即输入是PEM格式的私钥)。好答案。
Johnny Wong

1
更新:布赖恩的答案已经更正为-m pkcs8它尽管使用了错误的名称OpenSSH的乡亲不会产生X.509“PUBKEY”。此外,由于2014-01年的OpenSSH 6.5如果创建者指定了“新格式” -o以提高安全性,则此方法将不起作用,并且自2018-08年的7.8开始,默认值为同上。
dave_thompson_085

11

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

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

这实际上可以在Linux和macOS上使用。
杰伊·泰勒

从OpenSSL中的私钥中提取等效的生成的公钥openssl rsa -in key -pubout -out key.pub.openssl.pkcs8
Mohannd

6

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

openssl rsa -in ~/.ssh/id_rsa -outform pem > id_rsa.pem

这实际上似乎不起作用。
2014年

5
这仅适用于私有RSA密钥,而不适用于公共密钥OP要求的密钥。答案错了。
Devy 2015年

3
实际上,id_rsa已经是正确的格式,您可以自己检查出来,结果id_rsa.pem是100%相同。
米罗·科罗帕切克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.