我在生成 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 文档指出:
- “使用 EVP_PKEY 结构处理公钥的 RSA_PUBKEY() 函数”
- “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 库来交换内容。
幸运的是,有人编写了代码来执行此操作:
答案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-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''.
答案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