将单行的RSA私钥SSH密钥转换为多行格式

9
我有一些已转换为单行等价物的私钥。
这些密钥相当多。
所以我决定花点时间编写一个脚本来进行转换。
但效果不是很好。
-----BEGIN RSA PRIVATE KEY----pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4= pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4= pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4= pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4= pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4= -----END RSA PRIVATE KEY-----

我正在使用 echo ~/.ssh/id_rsa | tr " " "\n"

这将返回:

-----BEGIN 
RSA 
PRIVATE 
KEY----- 
pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=
pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=
pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=
pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=
pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=pEdInVAbH4d0PH4=
-----END
RSA
PRIVATE
KEY-----


我一直在尝试找到最好的方法,将其转换回正确的格式。

哈哈,你刚刚使用了我还没有发布的C# PEM编码器/解码器。严肃地说,这是标准的OpenSSL / PEM格式,不是SSH特有的。 - Maarten Bodewes
哎呀,谁写的RSA私钥完全搞砸了,那不是一个单一的base64行,很可能只是所有组件都分别进行了base64编码。它还缺少一个在预封装边界中的破折号(即头行)。 - Maarten Bodewes
1
@MaartenBodewes 我认为这只是虚拟字符,因为 OP 不想透露他们的私钥。 - Robby Cornelissen
3个回答

22

假设有一个标准的RSA私钥,只是去除了换行符,在进行一些sed替换后,可以恢复到原始格式:

sed -e "s/-----BEGIN RSA PRIVATE KEY-----/&\n/"\
    -e "s/-----END RSA PRIVATE KEY-----/\n&/"\
    -e "s/\S\{64\}/&\n/g"\
    ~/.ssh/id_rsa

标准键格式要求BEGINEND语句在单独的行上,并且将Base64编码的键格式化为64列。以上命令将帮助您完成此操作。


@WilliamRoss 最好的猜测是:你的起始标记与我的代码中的不同 (-----BEGIN RSA PRIVATE KEY-----)。也许你的是 BEGIN EC PRIVATE KEY 或者 BEGIN PRIVATE KEY。或者在某个时候你不小心删除了一个连字符... - Robby Cornelissen
@WilliamRoss,您删掉评论是想表达我的猜测是正确的,而且您的问题已经解决了吗? - Robby Cornelissen

3

@robby 感谢你的答案,我根据您的建议进行了调整,结果对我有用。

sed -e "s/-----BEGIN RSA PRIVATE KEY-----/&\n/" -e "s/\S\{64\}/&\n/g" | sed "s/^\s//g" ~/.ssh/id_rsa

我在Ubuntu上尝试过,可以运行。但在MacBook上无法运行。 - roy
2
你需要在Mac上安装GNU sed,例如使用brew install gnu-sed命令,然后使用gsed代替sed - RubenLaguna

1

我将解决方案适应于ed25519算法,以通过SSH与Gitlab通信。感谢@Robby!

RUN sed -i -e "s/-----BEGIN OPENSSH PRIVATE KEY-----/&\n/"\
    -e "s/-----END OPENSSH PRIVATE KEY-----/\n&/"\
    -e "s/\S\{70\}/&\n/g"\
    /root/.ssh/id_ed25519

输入

-----BEGIN OPENSSH PRIVATE KEY----- XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX== -----END OPENSSH PRIVATE 
KEY-----

输出

-----BEGIN OPENSSH PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX==
-----END OPENSSH PRIVATE KEY-----

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接