如果我使用以下

openssl req -x509  -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes


我得到private.pempublic.pem

如果我使用

ssh-keygen -t rsa -f rsa


我得到rsarsa.pub

是否可以从rsa的格式转换为private.pem,反之亦然?

编辑:要更多具体来说,

a)如果我具有上述命令生成的private.pempublic.pem,如何获得等效的rsa私钥和公钥?

b)给定rsarsa.pub,如果我确实知道上述openssl命令所包含的其他元数据,如何获取x509密钥?

如果我从openssh格式转到x509,然后理想地返回相同的密钥文件返回。

评论

另请参阅:unix.stackexchange.com/a/30074/22709和web.archive.org/web/20120124211352/http://blog.oddbit.com/2011/…

请不要将同一私钥用于ssl + ssh等不同用途/协议。任何协议的加密审核始终假定私钥不在其他任何地方使用。像3-Shake这样的错误表明,仅在SSL / TLS协议内很难安全地设计密码。

还请参见ssh-keygen和以X.509格式编写用户证书吗?

#1 楼

您可能会在这里丢失一些信息。

ssh-keygen可用于将公共密钥从SSH格式转换为适合OpenSSL的PEM格式。私钥通常已经以适合两者的PEM格式存储。

但是,您显示的OpenSSL命令会生成自签名证书。该证书不是传统上用于OpenSSH的东西-绝对不是仅与公用密钥相同的东西。

OpenSSH确实也支持证书,但是您可能不支持该证书。使用此支持。另外,这些证书不是X.509,因此与OpenSSL不兼容。

该证书包含在其他任何地方都没有的信息,并且每个证书都是唯一的,无法随意重新创建。这意味着,如果您希望为OpenSSL和OpenSSH使用相同的密钥,则除了私钥之外,还需要存储X.509证书。


如果您只想共享私钥,您的示例命令生成的OpenSSL密钥存储在private.pem中,并且它应该已经是与(最近)OpenSSH兼容的PEM格式。要从中提取与OpenSSH兼容的公钥,只需运行:

ssh-keygen -f private.pem -y > private.pub



如果您想从OpenSSH开始并逐步过渡到具有自签名证书(无论出于何种原因)的OpenSSL方面,操作方法如下:

始终可以根据需要从测试用户重新创建test-user

评论


谢谢!这有助于澄清很多事情。我可以使用ssh密钥自签名并生成此证书吗?

– anshul
13年3月18日在12:57



您可以,私钥已经是兼容格式,因此您可以在OpenSSL命令中使用它。

–可以裸体
13年3月18日在13:16

您能否解释一下我如何在openssl命令中使用该私钥?我试着读那个人,但是什么也没得到。

– anshul
13年3月18日在15:26

我确实做到了,尽管我开始怀疑这对您实际上是否有用-如果您仍希望理想的来回转换而又不丢失数据,那并不是一个有意义的目标。

–可以裸体
13年3月18日在19:58

这可能是我所希望的最完整的答案。非常感谢!

– anshul
13年3月18日在20:49

#2 楼

openssh的ssh-keygen工具可以为您完成此操作。

以下命令将为您将.pub文件转换为pem格式。 > ssh-keygen -f rsa.pub -e -m pem还支持转换为其他多种格式,有关更多信息,请参见手册页。

评论


这仅适用于rsa密钥,不适用于dsa,ecdsa或ed25519。

– Jeroen
15-10-29在13:22

当我尝试此操作时,我发现-m pem没有提供与openssl兼容的键,但-m PKCS8提供了。

– Peter Green
15年12月16日在17:34

OpenSSL库支持@ PeterGreen + OpenSSH所谓的-m pem,但大多数openssl命令行操作不支持。在1.0.0(2010)中,向上命令行rsa -RSAPublicKey_in可以读取它并可以转换为大多数其他操作使用的'SPKI'(aka PUBKEY)格式-但是错误命名的ssh-keygen -e -m pkcs8已经做到了。

–dave_thompson_085
19年7月9日在4:49



#3 楼

OpenSSL的较新版本(至少> = 1.0.1)使用PKCS#8格式的密钥。

因此,如果您使用命令

openssl x509 -in certificate.pem -noout -pubkey >pubkey.pem


您需要使用以下命令将其转换为authorized_keys条目

ssh-keygen -i -m PKCS8 -f pubkey.pem


OpenSSL的req命令的out选项会生成证书请求,而不是

要提取PKCS#8格式的公共密钥,可以使用以下命令通过ssh-keygen的导入功能来理解。

openssl req -in public.pem -noout -pubkey


评论


ssh-keygen -m所谓的PKCS8实际上是X.509中的SubjectPublicKeyInfo格式,OpenSSL一直将其永远用作公钥。实际的PKCS8标准格式仅适用于私钥,OpenSSL长期以来一直将PKCS8和“旧式”格式都用于私钥,为PKCS8正确使用了名称pkcs8,尽管2010年的1.0.0将某些命令行操作从旧版转移到了PKCS8。使它引起以前从未注意到的人们的注意。

–dave_thompson_085
16-10-23在7:47



#4 楼

可以使用以下命令将2048位公共RSA密钥从X.509 PEM格式转换为OpenSSH格式(请参阅答案)。从链接的答案中获得信息,就可以很容易地在另一个方向上编写转换。

echo -n "ssh-rsa " > rsa2048.pub
grep -v -- ----- rsa2048.pem | base64 -d | dd bs=1 skip=32 count=257 status=none | xxd -p -c257 | sed s/^/00000007\ 7373682d727361\ 00000003\ 010001\ 00000101\ / | xxd -p -r | base64 -w0 >> rsa2048.pub
echo >> rsa2048.pub


#5 楼

我设法使用Windows工具puttygen.exe来实现以下目的:



所以:回答密码短语挑战)
一旦加载,请按照上图中的选择进行转换->导出OpenSSH密钥
给它一个名称,它应该可以工作,对我来说才有效。


#6 楼

我找不到适合该工作的工具,因此我不屑一顾,通过阅读OpenSSH源代码和一些在线PEM / DER调试器手动编写了一些代码。

我将其编写为在任意大小的RSA密钥以及ECDSA P-256和P-384的PKCS8,PKCS1(仅用于RSA),SEC1(仅用于ECDSA)和“专有” OpenSSH格式之间进行转换。


https://git.coolaj86.com/coolaj86/ssh-to-jwk.js
https://git.coolaj86.com/coolaj86/jwk-to-ssh.js

安装

它是为node.js编写的(我正在努力将其移植到浏览器中),因此您必须先安装它:


https ://nodejs.org

然后:

npm install -g rasha eckles ssh-to-jwk jwk-to-ssh


Rasha用于RSA,Eckles用于ECDSA。

/>从PEM到OpenSSH

RSA

rasha privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_rsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_rsa.pub


ECDSA

eckles privkey.pem > privkey.jwk.json

jwk-to-ssh privkey.jwk.json root@localhost > id_ecdsa

jwk-to-ssh privkey.jwk.json root@localhost public > id_ecdsa.pub


OpenSSH到PEM

RSA

ssh-to-jwk id_rsa > privkey.jwk.json

rasha privkey.jwk.json > privkey.pem

rasha privkey.jwk.json public > pubkey.pem


ECDSA

ssh-to-jwk id_ecdsa > privkey.jwk.json

eckles privkey.jwk.json > privkey.pem

eckles privkey.jwk.json public > pubkey.pem


评论


可以通过serverfault.com/a/950686将现有的RSA OpenSSH转换为PEM。我还没有尝试过ECDSA。

– Andrei
19年8月12日在9:16