有没有办法将现有的 OpenSSH 密钥对转换为 SSH2(ssh.com 格式)密钥对?
UPD:由于有一些关于ssh-keygen
突然出现的答案,我将解释我来自哪里(这也是关于“你尝试过什么?”的一个很好的答案)。
$> diff --report-identical-files <(ssh-keygen -e -f ~/.ssh/id_dsa) <(ssh-keygen -e -f ~/.ssh/id_dsa.pub)
Files /tmp/zshAGGWAK and /tmp/zshPZiIr6 are identical
换句话说,ssh-keygen
为私钥和公钥输入密钥返回相同的密钥(原始文件的哈希值明显不同,我已经检查了它们两次以确保它们是有效的私钥和公钥)。似乎ssh-keygen
只为私人或公共输入密钥生成公共密钥。
我做错了还是这是正常行为?
答案1
本教程的标题为:SSH:将 OpenSSH 转换为 SSH2,反之亦然似乎提供了您正在寻找的东西。
将 OpenSSH 密钥转换为 SSH2 密钥
ssh-keygen
在 OpenSSH 公钥上运行 OpenSSH 版本,将其转换为远程计算机上 SSH2 所需的格式。这必须在运行 OpenSSH 的系统上完成。
$ ssh-keygen -e -f ~/.ssh/id_dsa.pub > ~/.ssh/id_dsa_ssh2.pub
将 SSH2 密钥转换为 OpenSSH 密钥
ssh-keygen
在 ssh2 公钥上运行 OpenSSH 版本,将其转换为 OpenSSH 所需的格式。这需要在运行 OpenSSH 的系统上完成。
$ ssh-keygen -i -f ~/.ssh/id_dsa_1024_a.pub > ~/.ssh/id_dsa_1024_a_openssh.pub
本教程继续展示如何生成各种类型的密钥以及如何将它们导出为其他格式。
使用它作为私钥和公钥吗?
根据手册页,答案是肯定的。查看其手册页,ssh-keygen
该开关的说明如下-e
:
-e This option will read a private or public OpenSSH key file and print
the key in RFC 4716 SSH Public Key File Format to stdout. This option
allows exporting keys for use by several commercial SSH implementations.
但实际上,似乎ssh-keygen
无法转换私钥,只能转换公钥。
例如:
# Make a new RSA key-pair
$ ssh-keygen -t rsa -f newkey
# attempt to extract the private key
$ ssh-keygen -e -f newkey > newkey_e
# attempt to extract the public key
$ ssh-keygen -e -f newkey.pub > newkey.pub_e
# Notice the supposed extracted private key (newkey_e) and the corresponding extracted public key (newkey.pub_e) have identical `md5sum`'s.
$ for i in *;do md5sum $i;done
d1bd1c12c4a2b9fee4b5f8f83150cf1a newkey
8b67a7be646918afc7a041119e863be5 newkey_e
13947789d5dcc5322768bd8a2d3f562a newkey.pub
8b67a7be646918afc7a041119e863be5 newkey.pub_e
查看提取的密钥结果证实了这一点:
$ grep BEGIN newkey_e newkey.pub_e
newkey_e:---- BEGIN SSH2 PUBLIC KEY ----
newkey.pub_e:---- BEGIN SSH2 PUBLIC KEY ----
谷歌搜索了一下,我从一篇标题为以下的文章中发现了这个简介:如何将 OpenSSH 私钥文件转换为 SSH。该网站似乎上下起伏,但往内看Google对此页面的缓存我发现了以下简介:
如何将 OpenSSH 私钥文件转换为 SSH.com 私钥文件?
尽管大多数手册页都说可以,但 ssh-keygen 程序无法完成此操作。他们不鼓励这样做,因此您将使用多个公钥。唯一的问题是 RCF 不允许您注册多个公钥。
本文继续介绍一种通过使用以下命令将 openssh 私钥转换为 ssh.com 私钥的方法腻子的 puttygen
工具。笔记: puttygen
可以在 Windows 和 Linux 上运行。
打开“puttygen”并生成 2048 位 rsa 公钥/私钥对。确保在生成密码后添加密码。将公钥保存为“puttystyle.pub”,将私钥保存为“puttystyle”。 putty 程序和 SSH.com 程序共享通用的公钥格式,但 putty 程序和 OpenSSH 具有不同的公钥格式。我们稍后会再讨论这一点。您应该能够将两个 puttystyle 键加载到 putty 程序中。但是,putty 和 SSH.com 的私钥格式不同,因此您必须创建一个转换后的文件。转到转换菜单并导出 SSH.com 密钥。将其保存为“sshstyle”。现在返回转换菜单并导出 openssh 密钥。将其保存为“openssh”。这些名称是任意的,您可以选择自己的名称。稍后您必须更改 OpenSSH 计算机上的安装名称。见下文。
鉴于上述情况puttygen
,我使用我们之前生成的私有/公共 openssh 密钥对得出了以下结果:
# generate ssh.com private key from private openssh key
$ puttygen newkey -O private-sshcom -o newkey.puttygen-sshcom
# generate ssh.com public key from private openssh key
$ puttygen newkey -O public -o newkey.pub_puttygen-sshcom
# generate openssh public key from private openssh key (for confirmation)
$ puttygen newkey -O public-openssh -o newkey.pub_puttygen-openssh
注释不同,因此您不能只比较结果文件,因此如果您查看键的前几行,这是一个很好的指标,表明上述命令是否成功。
ssh.com 公钥比较:
$ tail -n +3 newkey.pub_e | head -1 | cut -c 1-60
AAAAB3NzaC1yc2EAAAADAQABAAABAQDFkZdpmbze9c6pT883rE1i64TJd4wb
$ tail -n +3 newkey.pub_puttygen-sshcom | head -1 | cut -c 1-60
AAAAB3NzaC1yc2EAAAADAQABAAABAQDFkZdpmbze9c6pT883rE1i64TJd4wb
openssh 公钥比较:
$ cut -c 1-100 newkey.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFkZdpmbze9c6pT883rE1i64TJd4wbz9x/w6I2DmSZVI9TJa6M9jgGE952QsOY
$ cut -c 1-100 newkey.pub_puttygen-openssh
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFkZdpmbze9c6pT883rE1i64TJd4wbz9x/w6I2DmSZVI9TJa6M9jgGE952QsOY
答案2
ssh-keygen
不会导出 pem 格式的私钥,但会将现有的 openssh 私钥转换为 pem 格式,覆盖原始私钥。您所要做的就是编辑密码。
将文件从 OpenSSH 格式转换为 SSH2 (pem) 格式的命令~/.ssh/id_rsa
是:
ssh-keygen -p -f ~/.ssh/id_rsa -m pem
然后根据提示提供(旧)和新密码。它们可以相同,甚至都为空。或者您可以使用-P
(旧密码)和-N
(新密码)选项在命令行上提供它们。例如,如果密码为空,并且您希望保留该密码:
ssh-keygen -p -P '' -N ''-f ~/.ssh/id_rsa -m pem