key_load_public:格式无效

Jor*_*nGS 64 git ssh github public-key

我使用PuTTY Key Generator生成带密码的4096位RSA-2密钥.

我保存.ppk和openSSL格式的公钥.putty格式的公钥不起作用.

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

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

有什么问题?

我使用Pageant来加载密钥,我使用Git Bash来尝试ssh连接.我还把密钥加载到GitHub中,不知道我做错了什么.

我尝试添加一个新行,而不是在GitHub中添加新行

sam*_*man 122

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

OpenSSH的

与流行的看法相反,这种格式不会被生成器保存.但是它会生成并显示在标题为"粘贴到OpenSSH authorized_keys文件的公钥"的文本框中.要将其另存为文件,您必须从文本框中手动复制它并将其粘贴到新的文本文件中.

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

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key
Run Code Online (Sandbox Code Playgroud)

密钥的格式很简单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
Run Code Online (Sandbox Code Playgroud)

如果您只有PUTTY私钥(id_rsa.ppk文件),则需要先进行转换.

  1. 打开PuTTY Key Generator
  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-----
Run Code Online (Sandbox Code Playgroud)

可以使用OpenSSH私钥(在上面的"重新生成公钥"中生成)使用以下命令生成此文件:

ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用OpenSSH公钥:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem
Run Code Online (Sandbox Code Playgroud)

参考文献:

  • `ssh-keygen -f ~/.ssh/id_rsa -y &gt; ~/.ssh/id_rsa.pub` 这解决了它。谢谢! (5认同)

Pra*_*ama 23

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

第一步:下载最新的puttygen并打开puttygen

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

加载现有的私钥

第 3 步:如果询问,请输入密钥的密码并点击确定

输入短语

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

保存 OpenSSH 文件

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

  • 当我使用 **Export OpenSSH key** 导出密钥时,收到“load pubkey invalid format”警告。当使用 **导出 OpenSSH 密钥(强制新文件格式)** 时,它消失了。 (4认同)

pap*_*ees 10

TL;DR:还要确保您id_rsa.pub的格式为 ascii / UTF-8。

我遇到了同样的问题,但是由于文本编码,单独接受的答案不起作用,这是一个额外的,容易错过的问题。

当我跑

ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

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

key_load_public: invalid format
Run Code Online (Sandbox Code Playgroud)

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

PS 这可能是对已接受答案的补充,但我还没有足够的业力在这里发表评论。

  • 正如您所发现的,管道在 Powershell 中的工作方式有所不同。您可以使用 `ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pub` 代替。 (2认同)

Jay*_*eli 8

使用以下命令生成 id_rsa 和 id_rsa.pub 文件:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Run Code Online (Sandbox Code Playgroud)

然后 :

1) Place file in id_rsa.pub into ~/.ssh/id_rsa.pub

2) sudo chmod 600 ~/.ssh/id_rsa.pub

3) Place file id_rsa into ~/.ssh/id_rsa

Now ~/.ssh contains two files..~/.ssh/id_rsa.pub and ~/.ssh/id_rsa

4) ssh-add  ~/.ssh/id_rsa

5) Enter the passphrase entered during creation of id_rsa

Output :

Identity added: /home/jay/.ssh/id_rsa (/home/jay/.ssh/id_rsa)
Run Code Online (Sandbox Code Playgroud)

现在您无需输入用户名密码即可推拉


小智 7

如果您使用剪贴板复制您的公钥并粘贴它,则可能会发生包含换行符的公钥字符串可能会被破坏。

Make sure your public key string formed as one line.


Rol*_*ith 5

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

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

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