如何将ed25519私钥转换成putty的ppk格式?

36

我想将由ssh-keygen命令生成的ed25519私钥转换为ppk文件,但是我遇到了错误。

无法加载私钥(未识别的密码名称)

有人可以帮帮我吗?

  • 测试的openssh版本:OpenSSH_7.6p1,OpenSSL 1.1.0g 2 Nov 2017OpenSSH_7.6p1,OpenSSL 1.0.2n 7 Dec 2017(在CoreOS和ArchLinux docker容器上)

  • 测试的putty版本:0.70 64位0.70 32位快照版(在Windows 10上)

我的步骤如下。

1. 生成ed25519私钥

# ssh-keygen -t ed25519 -a 100
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:2HfORujStwmC9c91rmDxMbaV9kVMT70gWxnRXAvNrNU root@f46f23bbad55
The key's randomart image is:
+--[ED25519 256]--+
|             +X B|
|           . +.@E|
|            + +.=|
|       o   o . o.|
|      . S o + +oo|
|       o = = +.=o|
|      . o = B + o|
|         o B = o |
|            = ...|
+----[SHA256]-----+

# cat .ssh/id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABClhk1367
G8CQYpo/0c7UShAAAAZAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIIJiwIymcly4s66p
za/IL3ZNyT5CiMPj0R+/LnMDmABUAAAAoMJIakdbIL7TOAmX8n4xGSrtp8mc/Mr6qimZAZ
zGB7iRhNUXT+isPdf0YuC9mh5NbX43ZYFl+/sWdi2hVmJxbGTwrjaSdNzF3ZnSpi/aVlzF
t3bUCtdwhHLaLqy9unw0zPHlfcQsB700GS/bf4VKRmm1+imj3cAldUm2RF3VdI0U9/04yX
Mj+VBOmevM0i7R/0d6xUFTH3zj99xxeLI2J6A=
-----END OPENSSH PRIVATE KEY-----

# cat .ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIJiwIymcly4s66pza/IL3ZNyT5CiMPj0R+/LnMDmABU root@f46f23bbad55

2. 在Windows上运行puttygen.exe,尝试导入ed25519私钥(.ssh/id_ed25519)

无法加载私钥(未识别的密码名称)

8个回答

28

18

上面回答中的命令只是以RFC4716格式打印公钥部分。

在某一点上,ssh-keygen会生成不使用puttygen支持的密码器的openssh私钥。

ssh-keygen不提供指定密码器名称以加密生成的openssh私钥的选项。

有一个解决方法:在导入puttygen之前从密钥中删除密码。

$ cp ~/.ssh/id_ed25519 ~/.ssh/id_ed25519-for-putty

$ ssh-keygen -p -f ~/.ssh/id_ed25519-for-putty
Enter old passphrase: <your passphrase>
Enter new passphrase (empty for no passphrase): <press Enter>
Enter same passphrase again: <press Enter>

接下来,使用puttygen将~/.ssh/id_ed25519-for-putty转换为.ppk并在puttygen中设置口令。

别忘了出于显而易见的原因切记销毁并移除~/.ssh_id_ed25519-for-putty文件。


您也可以尝试使用快照中的puttygen,因为最新的快照包括对AES256CTR加密的openssh密钥格式的支持。 - mydeardiary

8

在将密钥导入puttygen之前,您需要将密钥导出为RFC4716格式。

$ ssh-keygen -e -m RFC4716 -f ~/.ssh/id_ed25519 > ~/.ssh/exported_id_ed25519

然后,将导出的 exported_id_ed25519 导入到 puttygen 中,并将密钥转换为 .ppk 格式。

3
不论我选择私钥文件作为输入,这个命令对我来说都只写了公钥,有没有办法指定要写入哪一个作为输出,或者这是我使用的ssh-keygen版本中存在的错误? - codeling
1
@codeling 您是正确的。上面提出的方法方向是正确的,但是将私钥(id_rsa)导入putty的正确命令是:ssh-keygen -p -P“<旧密码>”-N“<新密码>”-m PEM -f id_rsa。 - Andreas

5
实际上,这个问题并不涉及Ed25519本身,而是由于新的openssh格式导致的。以下是 man ssh-keygen 关于-o选项的说明:
-o 使ssh-keygen使用新的OpenSSH格式保存私钥,而不是更兼容的PEM格式。新格式具有更高的抵抗暴力破解密码的能力,但不受早于6.5版的OpenSSH版本支持。Ed25519密钥始终使用新的私钥格式。
新格式使用密钥派生函数(KDF)对私钥文件进行几次加密(通常约100次),以使解密变慢。要进一步了解使用bcrypt KDF的新格式的详细信息,请访问此链接:https://pthree.org/2014/12/08/super-size-the-strength-of-your-openssh-private-keys/ 尝试将ssh-keygen用于带有-o选项的rsa或dsa类型的私钥,您会发现puttygen也无法解析它们。正如您在man页面中看到的那样,在Ed25519中没有为puttygen提供选择。
经过一些努力后,我现在只使用用puttygen生成的密钥,但我担心我不能获得KDF的好处。

2

我遇到了同样的问题,私钥绝对有效,但是PuTTYGen拒绝接受并显示“无法加载私钥(不是已识别的密钥格式)”。

经过一段时间的研究,我意识到这是因为我从Linux终端复制粘贴到Windows控制台。生成的私钥看起来完全相同,但是长度不同 - 显然是由于Linux和Windows中的不同换行符所导致的。

当我通过网络将私钥复制为一个文件时,PuTTYGen可以愉快地接受它。

我认为这可能对陷入同样困境的人有用。


0

最近我部署了一台Debian系统并更新了我的putty应用程序,遇到了同样的问题,但将其从0.70更新到0.72解决了这个问题。 我的私钥是在Debian系统中使用以下命令生成的,然后传输到我的Windows PC。

ssh-keygen -b 4096


0

虽然已经有一个被接受的答案,但是将已生成的私钥(id_rsa)转换为putty格式的方法如下:

  1. 使用以下命令:ssh-keygen -p -P "<old pass phrase>" -N "<new pass phrase>" -m PEM -f id_rsa 将密钥转换为putty可接受的格式
  2. 打开PuttyGen,从顶部菜单中选择“Convertions”,然后选择“Import key”(在此处会提示您输入密码短语,如果在密钥生成时提供了密码短语,请输入并单击确定)
  3. 最后,单击“保存私钥”,您就可以开始使用了!

0

我认为 Putty Key Generator 可以做到这一点。

  1. 从菜单栏中选择 Conversions -> Import Key。
  2. 将您的 ed25519 密钥导入其中。
  3. 使用扩展名为 ppk 保存私钥。

这样,你就准备好了,我想。


请提供明确的答案。似乎用户已经尝试过这种方法。 - Pritish Sehzpaul
@PritishSehzpaul 我怎么能比这更明确呢?请给我一个例子。 - Olgun Kaya
@PritishSehzpaul 我怎么能比这更明确呢?请给我一个例子。 - undefined
嗨@Olgun,使用Ed25519密钥,在putty gen中你必须在下方的"参数"部分提及"要生成的密钥类型:"。默认情况下选择RSA会导致错误的私钥。请确保选择正确的密钥类型。 - Pritish Sehzpaul

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