openssl req -x509 -days 365 -newkey rsa:2048 -keyout private.pem -out public.pem -nodes
我得到
private.pem
和public.pem
如果我使用
ssh-keygen -t rsa -f rsa
我得到
rsa
和rsa.pub
是否可以从
rsa
的格式转换为private.pem
,反之亦然?编辑:要更多具体来说,
a)如果我具有上述命令生成的
private.pem
和public.pem
,如何获得等效的rsa私钥和公钥?b)给定
rsa
和rsa.pub
,如果我确实知道上述openssl命令所包含的其他元数据,如何获取x509密钥?如果我从openssh格式转到x509,然后理想地返回相同的密钥文件返回。
#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
评论
另请参阅: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格式编写用户证书吗?