key_load_public:格式无效


99

我使用PuTTY密钥生成器生成带有密码短语的4096位RSA-2密钥。

我保存了.ppk和openSSL格式的公共密钥。腻子格式的公钥无效。

无论如何,我的错误如下:

$ ssh -T git@github.com
key_load_public: invalid format
Enter passphrase for key '/c/Users/Dan/.ssh/id_rsa':
Hi Dan! You've successfully authenticated, but GitHub does not provide shell access.

怎么了

我使用Pageant加载密钥,并使用Gi​​t Bash尝试ssh连接。我还将密钥加载到了GitHub,不确定我在做什么错。

我尝试在GitHub中添加新行而不添加新行


您为什么认为它不起作用?它说验证成功
罗兰·史密斯

2
@RolandSmith这是在告诉我key_load_public: invalid format在输入密码之前执行命令的正确时间吗?
JordanGS

1
这样做:'ssh -vvv -T git@github.com'以获取更多信息,可能〜/ .ssh / known_hosts是错误的-ssh正在寻找github的公钥。您可以运行“文件密钥”来找出密钥文件的格式。
mosh

Answers:


183

正如罗兰(Roland)在回答中提到的那样,这是一个警告,警告它ssh-agent不了解公钥的格式,即使那样,公钥也不会在本地使用。

但是,我也可以详细说明并回答为什么出现警告。简而言之,PuTTY密钥生成器会根据您在程序中执行的操作生成两种不同的公共密钥格式

注意:在我的解释中,将使用/生成的密钥文件将使用id_rsa其适当的扩展名进行命名。此外,为了方便复制粘贴,将假定键的父文件夹为~/.ssh/。根据需要调整这些细节以适合您的需求。

格式

链接到相关的PuTTY文档

SSH-2

当您保存使用的关键PuTTY密钥生成使用“保存公钥”按钮,它将被保存在由定义的格式RFC 4716

例:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "github-example-key"
AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYF
i2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcp
pY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3
oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEA
ip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9
tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw==
---- END SSH2 PUBLIC KEY ----

OpenSSH的

与流行的看法相反,这种格式不会由生成器保存。但是,它已生成并显示在标题为“用于粘贴到OpenSSHauthorized_keys文件的公共密钥”的文本框中。要将其保存为文件,您必须从文本框中手动复制它并将其粘贴到新的文本文件中。

对于上面显示的键,这将是:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key

密钥的格式很简单ssh-rsa <signature> <comment>,可以通过重新排列SSH-2格式的文件来创建。

重新生成公钥

如果您正在使用ssh-agent,则可能还会访问ssh-keygen

如果您具有OpenSSH专用密钥(id_rsa文件),则可以使用以下命令生成OpenSSH公用密钥文件:

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

如果只有PUTTY专用密钥(id_rsa.ppk文件),则需要先进行转换。

  1. 打开PuTTY密钥生成器
  2. 在菜单栏上,单击“文件”>“加载私钥”
  3. 选择你的id_rsa.ppk文件
  4. 在菜单栏上,单击“转换”>“导出OpenSSH密钥”
  5. 将文件另存为id_rsa(不带扩展名)

现在您已经拥有一个OpenSSH专用密钥,您可以使用上述ssh-keygen工具对密钥进行操作了。

奖励:PKCS#1 PEM编码的公钥格式

老实说,我不知道此键的用途,因为我不需要它。但是我多年来整理的笔记中都有它,为了有益于健康,我将其包括在此处。该文件将如下所示:

-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----

可以使用以下命令使用OpenSSH私有密钥(如上面“重新生成公共密钥”中生成的)生成文件:

ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem

另外,您可以使用以下方式使用OpenSSH公钥:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem

参考文献:


当您将私钥转换为OpenSSH密钥时,我认为建议不要扩展该文件,这是不可取的。当扩展名用于私钥时,我的git-client无法连接到远程存储库。
程序员

@ Programmer1994包含转换说明,作为将转换.ppk.pub文件的步骤。id_rsa实际被另一个程序使用的中间私钥的副作用被忽略了。我已将语言“最好是无扩展名”更改为“(无扩展名)”以消除任何歧义。每当我回头看这个答案时,我也借此机会重新表达了一些不满。感谢您的贡献。
samthecodingman '18 -10-1

感谢你的回答。我在您的答案“重新生成公共密钥”部分中使用了该命令,它解决了我的问题。
desmond13

您谈到了公共密钥。但是问题是由私钥id_rsa产生的。当我尝试通过ssh访问git服务器时,使用私有ssh密钥时,我收到相同的警告。
ahnbizcad

5
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub这解决了。谢谢!
德扎

16

如果可以安装和使用puttygen工具,则有一个简单的解决方案。以下是步骤。您应该具有私钥的密码。

步骤1:下载最新的puttygen和打开的puttygen

第2步:加载现有的私钥文件,请参见下图

加载现有私钥

步骤3:如果要求输入密钥的密码,然后单击确定

输入密码

步骤4:如下图所示,选择“转换”菜单选项卡,然后选择“导出OpenSSH密钥”

保存OpenSSH文件

将新的私钥文件保存在首选位置并相应地使用。


2
load pubkey invalid format当我使用Export OpenSSH key导出密钥时,得到警告。使用Export OpenSSH密钥(强制使用新文件格式)时,它消失了。
elsamuko

在linuxapt install putty-toolsyum install putty之后sudo puttygen private.ppk -O private-openssh-new -o private.pem
Typel

9

TL; DR:还请确保您使用的id_rsa.pub是ascii / UTF-8。

我遇到了同样的问题,但是由于文本编码,仅接受的答案无法正常工作,这是一个附加的,容易遗漏的问题。

当我跑步时

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub

在Windows PowerShell中,这样可以节省输出id_rsa.pubUTF-16 LE BOM编码,而不是UTF-8 。这是某些PowerShell安装的属性,在使用PowerShell在不带BOM的UTF-8中编写文件中对此进行了讨论。显然,OpenSSH无法识别以前的文本编码并产生相同的错误:

key_load_public: invalid format

将输出复制并粘贴ssh-keygen -f ~/.ssh/id_rsa -y到文本编辑器中是解决此问题的最简单方法。

PS:这可能是公认的答案的补充,但我在这里没有足够的业力可以发表评论。


1
您发现,管道在Powershell中的工作方式有所不同。您可以ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pub改用。
samthecodingman

7

如果您使用剪贴板复制公共密钥并将其粘贴,则可能会破坏包含换行符的公共密钥字符串。

确保您的公钥字符串形成一行。


5

似乎ssh无法读取您的公钥。但这没关系。

您将公共密钥上载到github,但是您使用私钥进行了身份验证。请参见中的“文件”部分ssh(1)


2
简而言之,转到腻子密钥生成,单击转换->打开ssh密钥并将其保存到id_rsa-确保您的HOME env变量指向您正在查看的.ssh文件夹,从系统中删除id_rsa文件的所有其他副本
Kalpesh Soni,


2

该错误具有误导性-pubkey指向私钥文件时显示“ ” ~/.ssh/id_rsa

就我而言,这只是一个丢失的公共密钥(因为我还没有从文件库中恢复它)。


细节

我曾经跳过~/.ssh/id_rsa.pub自动脚本的部署。

所有ssh用法都有效,但是错误使我想到了可能的混乱。

完全没有-strace帮助注意到触发器实际上是*.pub文件:

strace ssh example.com
...
openat(AT_FDCWD, "/home/uvsmtid/.ssh/id_rsa.pub", O_RDONLY) = -1 ENOENT (No such file or directory)
...
write(2, "load pubkey \"/home/uvsmtid/.ssh/"..., 57) = 57
load pubkey "/home/uvsmtid/.ssh/id_rsa": invalid format

1

我也有同样的警告。这是一个非常古老的钥匙。我在当前的OpenSSH 7上重新生成了一个密钥,该错误消失了。


0

因此,更新后我遇到了同样的问题。我使用的是key_file不带扩展名的PEM ,只是添加了已.pem解决的问题。现在文件是key_file.pem


0

如果您使用带有内置SSH的Windows 10,则从2020年8月开始,它仅支持ed25519密钥。key_load_public: invalid format如果使用例如RSA密钥,则会收到错误消息。

根据此GitHub问题,应该在2020年通过Windows Update进行修复。因此,一种解决方案是仅等待更新发布。

如果您迫不及待,则一种解决方法是生成一个新的ed25519密钥,无论如何这是一个很好的建议

> ssh-keygen -o -a 100 -t ed25519

您可以将其与github一起使用,但是某些较旧的系统可能不支持此较新的格式。

生成密钥后,如果您正在使用以下任一功能,请不要忘记对其进行更新!

  1. ~\.ssh\config 可能仍然指向旧密钥。
  2. 通过ssh-add命令将新密钥添加到ssh-agent
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.