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

How to convert ed25519 private key to putty ppk?

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

Couldn't load private key (unrecognized cipher name)

有人可以帮助我吗?

我的流程如下

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。 运行 puttygen.exe windows 并尝试导入 ed25519 私钥 (.ssh/id_ed25519)

Couldn't load private key (unrecognized cipher name)

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

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

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

上述答案中的命令只是以 RFC4716 格式打印 public 关键部分。

有时,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。

其实这个问题并不涉及Ed25519本身。它确实发生是因为新的 openssh 格式。以下是 man ssh-keygen 显示的有关 -o 选项的内容。

-o Causes ssh-keygen to save private keys using the new OpenSSH format rather than the more compatible PEM format. The new format has increased resistance to brute-force password cracking but is not supported by versions of OpenSSH prior to 6.5. Ed25519 keys always use the new private key format.

新格式使用密钥派生函数(KDF)对私钥文件进行多次加密(通常为100次左右),使解密变慢。使用 bcrypt KDF 搜索有关新格式的更多详细信息可以在此 link 中开始:https://pthree.org/2014/12/08/super-size-the-strength-of-your-openssh-private-keys/

您可以尝试将 ssh-keygen 与 -o 选项一起用于 rsa 或 dsa 类型的私钥,然后发现 puttygen 也无法解析这些。正如您在手册页中看到的那样,您无法在 Ed25519 中选择 puttygen。

经过一番挣扎,现在我只使用puttygen制作的密钥,但我担心我无法使用KDF。

2019-03-20更新: https://www.chiark.greenend.org.uk/~sgtatham/putty/releases/0.71.html 支持这些键

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

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

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

ssh-keygen -b 4096

我认为 putty 密钥生成器具有此功能。

  1. Select 转换 -> 从菜单栏导入密钥。
  2. 将您的 ed25519 密钥导入其中。
  3. 保存扩展名为 ppk 的私钥。

那你就可以走了,我想

虽然有一个公认的答案,但将已生成的私钥(id_rsa)转换为putty格式的方法:

  1. 使用此命令:ssh-keygen -p -P "<old pass phrase>" -N "<new pass phrase>" -m PEM -f id_rsa 将密钥转换为 putty 可接受的格式
  2. 打开 PuttyGen,然后从顶部菜单 select 转换,然后导入密钥(系统会提示您在此处输入密码,如果您在密钥生成中提供了密码,请输入密码并单击确定)
  3. 最后点击保存私钥,一切顺利!

我刚遇到同样的问题。私钥绝对有效,但 PuTTYGen 拒绝接受“无法加载私钥(不是公认的密钥格式)”。

一段时间后我意识到这是因为我从Linux终端复制粘贴它到Windows控制台。生成的私钥看起来完全一样,但长度不同——显然是因为 Linux 和 Windows.

中的换行符不同

当我通过网络将私钥复制成文件后,PuTTYGen欣然接受了

我认为这可能对落入我刚落入的相同陷阱的人有用。