如何将ed25519私钥转换为putty ppk?

tak*_*mag 14 putty openssh ed25519

我想将ed25519私钥(由ssh-keygen命令生成)转换为ppk文件.但我得到了错误.

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

有人能帮我吗?

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

  • 测试腻子版本:0.70 64bit,0.70 32bitsnapshot(在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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 15

上述答案中的命令只是以RFC4716格式打印公钥部分.

在某些时候,ssh-keygen生成openssh私钥,它不使用puttygen支持的密码.

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>
Run Code Online (Sandbox Code Playgroud)

然后,使用puttygen将〜/ .ssh/id_ed25519-for-putty转换为.ppk并从puttygen设置密码.

出于明显的原因,不要忘记切碎并删除〜/ .ssh_id_ed25519-for-putty.


Ada*_*ter 8

在撰写本文时,来自https://www.chiark.greenend.org.uk/~sgtatham/putty/snapshot.html的puttygen快照似乎支持这些密钥,其中0.70没有.在更改日志中没有明确提到它.

我测试过了 Development snapshot 2019-01-17.53747ad


小智 6

您需要先将密钥导出为RFC4716格式,然后再将密钥导入puttygen

$ ssh-keygen -e -m RFC4716 -f ~/.ssh/id_ed25519 > ~/.ssh/exported_id_ed25519
Run Code Online (Sandbox Code Playgroud)

然后,将生成的exported_id_ed25519导入puttygen,并将密钥转换为.ppk

  • 不知何故,即使我选择私钥文件作为输入,这个命令对我来说也只写入公钥。有什么方法可以指定将两者中的哪一个写入作为输出,或者这是我正在使用的 ssh-keygen 版本中的错误? (2认同)

Jan*_*oon 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/

您可以尝试使用带有 -o 选项的 ssh-keygen 来选择 rsa 或 dsa 类型的私钥,并且看到 puttygen 也无法解析这些。正如您在手册页中看到的那样,您无法选择 Ed25519 中的 puttygen。

经过一番挣扎,现在我只使用用 puttygen 制作的密钥,但恐怕我无法从 KDF 中受益。