Key_load_public: 格式无效

我使用 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 加载密钥,并使用 Git Bash 尝试 ssh 连接。我还把密钥加载到了 GitHub,不知道哪里做错了。

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

351825 次浏览

看起来 ssh无法读取您的公钥,但这并不重要。

你上传你的 公开密码匙到 github,但是你使用你的 私人钥匙进行身份验证。

正如 罗兰在他们的回答中提到的,这是一个警告,说明 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

与流行的看法相反,这种格式不会被生成器保存。但是,它是生成的,并显示在标题为“用于粘贴到 OpenSSH Authored_ 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

参考文献:

在用剪贴板复制并粘贴公钥的情况下,可能会发生包含新行的公钥字符串被中断的情况。

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

不要直接保存私钥,而是转换并导出 SSh 密钥。 有同样的问题,这对我很管用

我也收到了同样的警告。那是把很旧的钥匙。我在当前的 OpenSSH 7上重新生成了一个密钥,错误消失了。

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

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

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

Load an existing private key

步骤3: 如果询问,输入密码,然后点击 OK

enter paasphrase

步骤4: 如下图所示,选择“转换”菜单选项卡并选择“ Export OpenSSH key”

save OpenSSH file

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

所以,在更新之后,我遇到了同样的问题。我使用 PEM key_file没有扩展,只是添加 .pem修复了我的问题。现在文件是 key_file.pem

DR: 还要确保 id_rsa.pub为 ascii/UTF-8。

我也有同样的问题,但是由于文本编码,单独使用 公认的答案不起作用,这是一个额外的、容易被忽略的问题。

当我跑的时候

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

在 Windows PowerShell 中,它以 UTF-16 LE BOM编码而不是 UTF-8编码将输出保存到 id_rsa.pub。这是 PowerShell 的一些安装的属性,在 使用 PowerShell 在没有 BOM 的情况下用 UTF-8编写文件中已经讨论过。显然,OpenSSH 不能识别以前的文本编码,并产生了一个相同的错误:

key_load_public: invalid format

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

附注: 这可能是对 公认的答案的一个补充,但我还没有足够的业力来评论这里。

如果您使用带有内置 SSH 的 Windows10,那么从2020年8月起,它只支持 ed25519密钥。如果使用 RSA 密钥,就会得到 key_load_public: invalid format错误。

根据 GitHub 的问题,它应该在2020年的某个时候通过 Windows 更新修复。所以一个解决方案就是等待更新发布。

如果您不能等待,可以生成一个新的 ed25519密钥,即 总之是个好建议

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

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

在生成您的密钥之后,如果您正在使用下面的任何一个特性,不要忘记更新它们!

  1. ~\.ssh\config可能仍然指向旧的密钥。
  2. 通过 ssh-add命令将新密钥添加到 ssh-agent

这个错误具有误导性——它指向一个私钥文件 ~/.ssh/id_rsa时显示“ pubkey”。

在我的例子中,它只是一个丢失的公钥(因为我还没有从保险库中恢复它)。


细节

我过去常常跳过通过自动化脚本部署 ~/.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

@ uvsmtid 你的帖子终于让我找到了正确的 direction: 简单地删除(实际上是重命名)公钥文件 id_rsa.pub为我解决了这个问题,尽管对 无效格式喋喋不休,git 还是起作用了。 不太确定,但是实际上并不需要这个文件,因为发布密钥可以从私钥文件 id_rsa中提取。

当我尝试时,我有一个类似的错误 Load key "/root/.ssh/id_rsa": invalid format

RUN echo "$ssh_prv_key" > /root/.ssh/id_rsa &&     chmod 600 /root/.ssh/id_rsa

这会导致像 identity file /root/.ssh/id_rsa type -1 invalid formatread_passphrase: can't open /dev/tty这样的错误。

正确的做法是

COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa

解决方案是: 我的私钥格式错误——不是很多行,而是作为一行程序传递,你可能会遇到其他格式问题,比如开头或结尾的“-”,或者行尾的错误,比如缺少换行格式或者行尾的附加字母。

请参阅 Dockerfile: 使用无密码私钥克隆 repo。错误: “身份验证代理”或“ read _ passsphrase: can’t open/dev/tty”了解更多细节,主要思想来自 在 docker 文件中向 ssh-agent 添加私钥,其中又有来自 Gitlab CI/Docker: ssh-add 一直要求输入密码短语的思想。

在 Git-hub 中添加 SSH-KEY: Windows

在 cmd: ssh-keygen -t ed25519 -C "your-email-id"中键入这个

转到 C:\Users\your-name\.ssh

在那里你会得到一个文件: id_ed25519.pub

打开文件,复制,转到 Github-> set-> keys-> SSH-Key-> new SSH Key

粘贴你复制的钥匙

搞定!

使用以下命令生成 id _ rsa 和 id _ rsa. pub 文件:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

然后:

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)

现在您可以在不输入用户名密码的情况下按下 pull

中使用 IdentityFileIdentityFile ~/.ssh/KEYNAME.pub而不是 IdentityFile ~/.ssh/KEYNAME的错误

Ssh 不以用户友好的方式检查这些内容,即使配置是错误的,而不是文件。 我查了 ssh-keygen -l -f .ssh/KEYNAME.pub

Ssh-V 是 OpenSSH_8.2p1 Ubuntu-4ubuntu0.5, OpenSSL 1.1.1f 31 Mar 2020