SSH突然返回无效格式

Gre*_*nih 72 ssh rsa

所以不久前我在 AWS 上设置了一个服务器,并使用他们生成的 SSH 密钥。我将密钥保存到 Lastpass,并且之前已经成功地从那里检索到它,并使其正常工作。但是,今天再次尝试后,我无法让它工作。

-rw------- 1 itsgreg users 1674 Jun 6 12:51 key_name

我试过ssh -i key_name, ssh-keygen -f key_name,但没有任何效果,我总是收到此错误消息:

Load key "key_name": invalid format

有没有什么办法解决这一问题?

小智 58

从 openssh 7.6 开始,它默认为一种新的更安全的格式。您可以使用以下命令强制将其转换为该格式以更改您的密钥密码。如果您没有和/或不需要密码,只需按 Enter 键,它仍会以新格式重写密钥

ssh-keygen -f ~/.ssh/id_rsa -p
Run Code Online (Sandbox Code Playgroud)

  • 和来自 OpenSSH 的新 8.1 版本的 `ssh-keygen`(我之前使用过 7.7.2.1)甚至不想像新的 `ssh` 版本那样读取密钥:_Failed to load key id_rsa: invalid格式_ (2认同)
  • 工作正常,但在 Windows 上不行。和@Lu55有同样的问题。在 Linux 机器上完成,然后复制文件。那时一切都很好。 (2认同)

13d*_*tar 34

检查 的内容key_name,如果代理说invalid format,那么密钥有问题 - 比如 .. 你确定那是正确的密钥吗?即使它不是您需要的私钥,invalid format如果密钥有效,ssh 代理也不会返回,您将无法连接。出于某种原因,您可能已经将您的公钥放在那里。核实!

  • 肯定查过了。以 `----BEGIN RSA PRIVATE KEY -----` 开头,以 `-----END RSA PRIVATE KEY -----` 结尾。另外它曾经工作过。 (16认同)
  • 你可能只缺少一个尾随换行符 (11认同)
  • 哇,这真的有帮助!生成新密钥后,我注意到新密钥每行有 64 个字符,而我的旧密钥有 76 个。我将旧密钥重新格式化为每行只有 64 个字符,然后它开始工作了!我也错过了第一行的一个破折号。 (9认同)
  • 我在文件末尾缺少一个新行.... (5认同)
  • 似乎丢失的尾随换行符不应该引起问题,但确实如此。嘿 99% 的软件 - gfy (4认同)
  • “我也错过了第一行的一个破折号。” 同上。谢谢@ItsGreg。在终端之间选择和复制时,我经常错过第一个字符! (3认同)
  • 极不可能但仍有可能是文件已损坏。创建一个新的并从 lastpass 再次填充内容。 (2认同)

AKX*_*AKX 33

我遇到了同样的问题,结果由于某种原因,我在文件中使用了 Windows 样式 (CRLF) 行分隔符。

此外,文件必须以单个 LF 结尾。

修复这些让事情再次变得花花公子。

  • 这个人救了我。花了不到一分钟就修好了。记事本++>编辑>EOL转换>Unix (2认同)
  • 是的,我通过 Windows 远程桌面复制了我的密钥,它回车换行了我的密钥。 (2认同)

小智 26

我通过使用 PuTTY 密钥生成器将私钥转换为OpenSSH 格式,在 Windows 中解决了这个问题。

  1. 开始菜单 | 所有应用 | 腻子 |PuTTYgen
  2. 加载 my.ppk
  3. Conversions | Export OpenSSH key
  4. 节省 my_openssh.ppk

开始菜单、所有应用程序、PuTTY 部分、PuTTYgen

PuTTYgen,转换,导出 OpenSSH

现在这有效:

ssh -i "my_openssh.ppk" user@example.com
Run Code Online (Sandbox Code Playgroud)

Mac 转换:(感谢@ChrisGillatt

brew install putty 
puttygen ~/.ssh/my.ppk -O private-openssh -o ~/.ssh/my_openssh.ppk
Run Code Online (Sandbox Code Playgroud)

  • 以下是如何在 Mac 终端上执行此操作(假设您已安装 Brew): `brew install putty && puttygen ~/.ssh/my-key-name.ppk -O private-openssh -o ~/.ssh/my-key -名称` (2认同)

sta*_*fry 18

如果您收到有关公钥格式无效的警告,但该命令仍然有效,则可能是因为您只有一个私钥文件并且使用的是 OpenSSH 8.3。

OpenSSH 8.3 包括对 ssh 客户端的更改,它在其中查找私钥的相应公钥文件并输出此load pubkey "/home/user/.ssh/id.rsa": invalid format警告,但继续成功连接。使用 ssh 的工具,例如scpgit可能会显示key_load_public: invalid format.

客户端连接时不需要公钥,只需要私钥。所以这个检查是没有意义的,它已经被上游提交删除了,但还没有发布(还)。

在 ArchLinux 论坛上有一个关于这个的讨论

  • 谢谢!我的私钥缺少公钥。自从我生成了公钥后就没有问题了。:ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub (5认同)

小智 10

我今天刚刚在为我的 CI 管道编写一些 git 标记实用程序时遇到了这个问题。

这是我的两个键之间的区别:

$ diff ~/.ssh/gitlab ~/.ssh/git_ssh_key
27c27
< -----END OPENSSH PRIVATE KEY-----
---
> -----END OPENSSH PRIVATE KEY-----
\ No newline at end of file
Run Code Online (Sandbox Code Playgroud)

我像这样改变了我的代码:

     with open(ssh_key_file, 'w') as skf:
-        skf.write(ssh_key)
+        skf.write(ssh_key + '\n')
Run Code Online (Sandbox Code Playgroud)

现在我的 ssh 密钥有效了。

TL;DR - 我猜你必须在你的私钥末尾有一个换行符。

  • 是的,这正是我的问题。需要以空白换行符结尾的密钥文件。 (5认同)

小智 10

在 Fedora 32 最近更新后,我在连接到远程主机时开始收到此警告。

我解决了将pkcs11:添加到我的.ssh/config 中IdentityFile参数的问题,如下所示:

IdentityFile pkcs11:~/.ssh/my_key.pem 
Run Code Online (Sandbox Code Playgroud)

作为参考,摘自 ssh_config 手册页:

身份验证身份也可以以 PKCS#11 URI 的形式指定,以字符串 pkcs11: 开头。

  • 奇怪的是我收到警告,但可以登录。添加 pkcs11: 修复了警告,但阻止我登录,好像密钥现在是错误的。尝试从 Fedora 32 SSH 到 AWS EC2 (4认同)
  • 这为我解决了在“Fedora 32”上运行并连接到 Amazon EC2 时的问题。感谢分享! (2认同)

小智 8

就我而言,事实证明我在开始/结束“标题”和关键数据之间有换行符:

-----BEGIN RSA PRIVATE KEY-----

- Key data here -

-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

删除额外的新行,所以它变成了

-----BEGIN RSA PRIVATE KEY-----
- Key data here -
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

解决了我的问题。

  • 当我使用“复制”按钮从 LastPass(我使用过的所有密码管理器中用户体验最差的)复制私钥时,就发生了这种情况。使用键盘从愚蠢的单行输入字段进行复制解决了这个问题。粘贴后删除这些空行可能也有效,但未经测试。 (4认同)

小智 6

我要求 openssh 通过在 .ssh/config 文件中指定它来使用特定的身份文件。

原来的工作配置有

IdentityFile = <path to public key file> 
Run Code Online (Sandbox Code Playgroud)

这在没有任何更改的情况下停止工作。稍微思考了一下,我将上面的“公钥文件路径”替换为“私钥文件路径”。那奏效了。原因是根据 RSA 算法,公钥和私钥文件都具有大的拟素相关数。如果用公钥文件替换私钥文件,这些加密数字将无法从保存在密钥文件中的 base64 块中正确提取。似乎某些版本的 ssh 可以找出 .pub 扩展名并使用它来识别正确的私钥文件 - 而其他版本则不会这样做。这是发生此错误的另一种方式。希望它可以帮助某人。


小智 6

就我而言,发生这种情况是因为我在 DEK-Info 和实际关键数据之间缺少一个空行。我有:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,6E6F6E65206F6620796F757220627573
VGhpcyBpcyBub3QgbXkgYWN0dWFsIGtleSBzb3JyeSB0byBkaXNhcHBvaW50IHlv
...
Run Code Online (Sandbox Code Playgroud)

但它需要是:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,6E6F6E65206F6620796F757220627573

VGhpcyBpcyBub3QgbXkgYWN0dWFsIGtleSBzb3JyeSB0byBkaXNhcHBvaW50IHlv
...
Run Code Online (Sandbox Code Playgroud)


小智 5

您应该将 .ppk 密钥转换为 OpenSSH 密钥

操作方法如下

  1. 下载 PuttyGen 并生成您的密钥对(如果您没有准备好密钥对)。将私钥保存到您的文件夹 (.ppk)
  2. 如果您已经拥有私钥,请按“加载”按钮加载私钥文件 (.ppk)。否则跳过此步骤
  3. 在菜单“转换”下,选择导出 OpenSSH 密钥,然后将其保存到您的文件夹中
  4. 现在您已经准备好使用密钥登录服务器而无需输入密码(我假设您已经将公钥放在 /root/.ssh/authorized_keys 下, chmod 600 /root/.ssh/authorized_keys ,并重新启动 SSHemon )

  • 我必须重新安装所有应用程序,并且曾经有效的密钥开始执行此操作。我的解决方案类似,只是我必须选择“导出 OpenSSH 密钥(强制新文件格式)”。常规的“导出 OpenSSH 密钥”生成了相同的密钥,但不起作用。 (2认同)

Lu5*_*u55 5

我在 Win32-OpenSSH 8.1 中遇到了兼容性问题。

这里的答案都不适合我,所以我找到了自己的方法:使用 PuTTYgen 实用程序将密钥转换为新格式。

  1. 运行新版本puttygen
  2. 打开密钥(转换 > 导入密钥)。输入密码。
  3. 以新的 OpenSSH 格式保存密钥(转换 > 导出 OpenSSH 密钥(强制新文件格式))

在此输入图像描述