key_load_public: 格式无效
key_load_public: invalid format
我使用 PuTTY 密钥生成器生成了一个带有密码的 4096 位 RSA-2 密钥。
我保存了 .ppk 和一个 openSSL 格式的 public 密钥。 putty 格式 public 密钥不起作用。
无论如何,我的错误如下:
$ 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
中添加新行而不是添加新行
ssh
似乎无法读取您的 public 密钥。不过没关系。
您将 public 密钥 上传到 github,但您使用 私钥 进行身份验证。参见例如ssh(1)
.
中的 FILES 部分
正如 Roland 在他们的回答中提到的那样,这是一个警告 ssh-agent
不理解 public 键的格式,即便如此,public密钥不会在本地使用。
不过,我也可以详细说明并回答为什么会出现警告。它简单地归结为 PuTTY 密钥生成器 生成 两种不同的 public 密钥格式 取决于您在程序中的操作.
注意: 在我的整个解释中,我将 using/generating 的关键文件将被命名为 id_rsa
并带有适当的扩展名。此外,为了 copy-paste 方便,密钥的 parent 文件夹将被假定为 ~/.ssh/
。根据需要调整这些细节以满足您的需要。
格式
Link to the relevant PuTTY documentation
SSH-2
当您使用 保存 使用 PuTTY 密钥生成器 使用“保存 public 密钥”按钮的密钥时,它将以 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
与流行的看法相反,此格式不会被生成器保存。但是它会生成并显示在标题为“Public key for pasting into OpenSSH authorized_keys file”的文本框中。要将其另存为文件,您必须手动从文本框中复制它并将其粘贴到新的文本文件中。
对于上面显示的密钥,这将是:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key
密钥的格式很简单ssh-rsa <signature> <comment>
,可以通过重新排列 SSH-2 格式的文件来创建。
正在重新生成 Public 键
如果您正在使用 ssh-agent
,您可能还可以访问 ssh-keygen
。
如果您有 OpenSSH 私钥(id_rsa
文件),您可以使用以下方法生成 OpenSSH Public 密钥文件:
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
如果您只有 PUTTY 私钥(id_rsa.ppk
文件),则需要先将其转换。
- 打开 PuTTY 密钥生成器
- 在菜单栏上,单击“文件”>“加载私钥”
- Select 你的
id_rsa.ppk
文件
- 在菜单栏上,单击“转换”>“导出 OpenSSH 密钥”
- 将文件另存为
id_rsa
(不带扩展名)
现在您已经有了一个 OpenSSH 私钥,您可以使用上面的 ssh-keygen
工具来对密钥执行操作。
奖励:PKCS#1 PEM-encoded Public 密钥格式
老实说,我不知道这个密钥是干什么用的,因为我不需要它。但我把它放在我多年来整理的笔记中,为了有益健康,我将把它包括在这里。该文件将如下所示:
-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----
可以使用 OpenSSH 私钥(如上面“重新生成 Public 密钥”中生成的那样)使用以下方法生成此文件:
ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem
或者,您可以使用 OpenSSH Public 密钥:
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem
##参考文献:##
如果您使用剪贴板复制 public 密钥并粘贴它,可能会发生包含 new-line.
的 public 密钥字符串被破坏的情况
确保您的 public 键字符串形成一行。
而不是直接保存私钥转到转换和导出 SSh 密钥。
有同样的问题,这对我有用
我有同样的警告。这是一把非常古老的钥匙。我在当前的 OpenSSH 7 上重新生成了一个密钥,错误消失了。
如果能安装使用puttygen工具,有一个简单的解决方法。以下是步骤。你应该有私钥的密码。
第一步:
下载最新的 puttygen 并打开 puttygen
第 2 步:
加载您现有的私钥文件,见下图
第 3 步:如果询问,请输入密钥的密码,然后点击确定
第4步:如下图select "conversion"菜单选项卡和select "Export OpenSSH key"
将新的私钥文件保存在首选位置并相应地使用。
因此,更新后我遇到了同样的问题。我在没有扩展名的情况下使用 PEM key_file
并简单地添加 .pem
解决了我的问题。现在文件是 key_file.pem
。
TL;DR: 还要确保您的 id_rsa.pub
是 ascii / UTF-8。
我遇到了同样的问题,但是 由于文本编码的原因单独不起作用,这是一个额外的、容易遗漏的问题。
当我运行
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
在 Windows PowerShell 中,它以 UTF-16 LE BOM 编码将输出保存到 id_rsa.pub
,而不是 UTF- 8。这是 属性 的一些 PowerShell 安装,在 Using PowerShell to write a file in UTF-8 without the BOM 中进行了讨论。显然,OpenSSH 无法识别以前的文本编码并产生相同的错误:
key_load_public: invalid format
将 ssh-keygen -f ~/.ssh/id_rsa -y
的输出复制并粘贴到文本编辑器中是解决此问题的最简单方法。
P.S。这可能是对 的补充,但我还没有足够的业力在这里发表评论。
如果您使用 Windows 10 和 built-in SSH,截至 2020 年 8 月,它仅支持 ed25519 密钥。如果您使用例如,您将收到 key_load_public: invalid format
错误RSA 密钥。
根据 this GitHub issue,它应该通过 Windows 在 2020 年的某个时间更新来修复。因此,一种解决方案是等待更新发布。
如果您等不及了,解决方法是生成一个新的 ed25519 密钥,即 good advice anyway。
> ssh-keygen -o -a 100 -t ed25519
您可以将它与例如github,但一些较旧的系统可能不支持这种较新的格式。
生成密钥后,如果您正在使用以下任一功能,请不要忘记更新它们!
~\.ssh\config
可能仍指向旧密钥。
- 通过
ssh-add
命令将新密钥添加到 ssh-agent
该错误具有误导性 - 它在指向私钥文件 ~/.ssh/id_rsa
.
时显示“pubkey
”
在我的例子中,它只是丢失了一个 public 密钥(因为我没有从保险库中恢复它)。
详情
我曾经跳过通过自动脚本部署 ~/.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 你的 post 终于把我引向了正确的方向 direction
:
简单地删除(实际上是重命名)public 密钥文件 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 format
和 read_passphrase: can't open /dev/tty
等错误。
正确的方法是使用
COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
解决方案说明:我的私钥格式错误 - 而不是很多行,它作为一行传递,并且您可能有任何其他格式问题,例如忘记在开头或结尾的“-”,或者行尾有问题,比如缺少换行格式或行尾多了一个字母。
参见 Dockerfile: clone repo with passwordless private key. Errors: “authentication agent” or “read_passphrase: can't open /dev/tty” for more details, with the main idea from Add private key to ssh-agent in docker file, which again had the idea from Gitlab CI/Docker: ssh-add keeps asking for passphrase。
在 Git-hub 中添加 SSH-KEY:Windows
在 cmd 中输入:ssh-keygen -t ed25519 -C "your-email-id"
转到C:\Users\your-name\.ssh
在那里你会得到一个文件:id_ed25519.pub
打开该文件,复制它,转到 github->setting->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)
现在不用输入用户名密码也可以推拉
我使用 PuTTY 密钥生成器生成了一个带有密码的 4096 位 RSA-2 密钥。
我保存了 .ppk 和一个 openSSL 格式的 public 密钥。 putty 格式 public 密钥不起作用。
无论如何,我的错误如下:
$ 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
中添加新行而不是添加新行ssh
似乎无法读取您的 public 密钥。不过没关系。
您将 public 密钥 上传到 github,但您使用 私钥 进行身份验证。参见例如ssh(1)
.
正如 Roland 在他们的回答中提到的那样,这是一个警告 ssh-agent
不理解 public 键的格式,即便如此,public密钥不会在本地使用。
不过,我也可以详细说明并回答为什么会出现警告。它简单地归结为 PuTTY 密钥生成器 生成 两种不同的 public 密钥格式 取决于您在程序中的操作.
注意: 在我的整个解释中,我将 using/generating 的关键文件将被命名为 id_rsa
并带有适当的扩展名。此外,为了 copy-paste 方便,密钥的 parent 文件夹将被假定为 ~/.ssh/
。根据需要调整这些细节以满足您的需要。
格式
Link to the relevant PuTTY documentation
SSH-2
当您使用 保存 使用 PuTTY 密钥生成器 使用“保存 public 密钥”按钮的密钥时,它将以 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
与流行的看法相反,此格式不会被生成器保存。但是它会生成并显示在标题为“Public key for pasting into OpenSSH authorized_keys file”的文本框中。要将其另存为文件,您必须手动从文本框中复制它并将其粘贴到新的文本文件中。
对于上面显示的密钥,这将是:
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5EwgnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8DGm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElw== github-example-key
密钥的格式很简单ssh-rsa <signature> <comment>
,可以通过重新排列 SSH-2 格式的文件来创建。
正在重新生成 Public 键
如果您正在使用 ssh-agent
,您可能还可以访问 ssh-keygen
。
如果您有 OpenSSH 私钥(id_rsa
文件),您可以使用以下方法生成 OpenSSH Public 密钥文件:
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
如果您只有 PUTTY 私钥(id_rsa.ppk
文件),则需要先将其转换。
- 打开 PuTTY 密钥生成器
- 在菜单栏上,单击“文件”>“加载私钥”
- Select 你的
id_rsa.ppk
文件 - 在菜单栏上,单击“转换”>“导出 OpenSSH 密钥”
- 将文件另存为
id_rsa
(不带扩展名)
现在您已经有了一个 OpenSSH 私钥,您可以使用上面的 ssh-keygen
工具来对密钥执行操作。
奖励:PKCS#1 PEM-encoded Public 密钥格式
老实说,我不知道这个密钥是干什么用的,因为我不需要它。但我把它放在我多年来整理的笔记中,为了有益健康,我将把它包括在这里。该文件将如下所示:
-----BEGIN RSA PUBLIC KEY-----
MIIBCAKCAQEAhl/CNy9wI1GVdiHAJQV0CkHnMEqW7+Si9WYFi2fSBrsGcmqeb5Ew
gnhmTcPgtM5ptGBjUZR84nxjZ8SPmnLDiDyHDPIsmwLBHxcppY0fhRSGtWL5fT8D
Gm9EfXaO1QN8c31VU/IkD8niWA6NmHNE1qEqpph3DznVzIm3oMrongEjGw7sDP48
ZTZp2saYVAKEEuGC1YYcQ1g20yESzo7aP70ZeHmQqI9nTyEAip3mL20+qHNsHfW8
hJAchaUN8CwNQABJaOozYijiIUgdbtSTMRDYPi7fjhgB3bA9tBjh7cOyuU/c4M4D
6o2mAVYdLAWMBkSoLG8Oel6TCcfpO/nElwIBJQ==
-----END RSA PUBLIC KEY-----
可以使用 OpenSSH 私钥(如上面“重新生成 Public 密钥”中生成的那样)使用以下方法生成此文件:
ssh-keygen -f ~/.ssh/id_rsa -y -e -m pem > ~/.ssh/id_rsa.pem
或者,您可以使用 OpenSSH Public 密钥:
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m pem > ~/.ssh/id_rsa.pem
##参考文献:##
如果您使用剪贴板复制 public 密钥并粘贴它,可能会发生包含 new-line.
的 public 密钥字符串被破坏的情况确保您的 public 键字符串形成一行。
而不是直接保存私钥转到转换和导出 SSh 密钥。 有同样的问题,这对我有用
我有同样的警告。这是一把非常古老的钥匙。我在当前的 OpenSSH 7 上重新生成了一个密钥,错误消失了。
如果能安装使用puttygen工具,有一个简单的解决方法。以下是步骤。你应该有私钥的密码。
第一步: 下载最新的 puttygen 并打开 puttygen
第 2 步: 加载您现有的私钥文件,见下图
第 3 步:如果询问,请输入密钥的密码,然后点击确定
第4步:如下图select "conversion"菜单选项卡和select "Export OpenSSH key"
将新的私钥文件保存在首选位置并相应地使用。
因此,更新后我遇到了同样的问题。我在没有扩展名的情况下使用 PEM key_file
并简单地添加 .pem
解决了我的问题。现在文件是 key_file.pem
。
TL;DR: 还要确保您的 id_rsa.pub
是 ascii / UTF-8。
我遇到了同样的问题,但是
当我运行
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
在 Windows PowerShell 中,它以 UTF-16 LE BOM 编码将输出保存到 id_rsa.pub
,而不是 UTF- 8。这是 属性 的一些 PowerShell 安装,在 Using PowerShell to write a file in UTF-8 without the BOM 中进行了讨论。显然,OpenSSH 无法识别以前的文本编码并产生相同的错误:
key_load_public: invalid format
将 ssh-keygen -f ~/.ssh/id_rsa -y
的输出复制并粘贴到文本编辑器中是解决此问题的最简单方法。
P.S。这可能是对
如果您使用 Windows 10 和 built-in SSH,截至 2020 年 8 月,它仅支持 ed25519 密钥。如果您使用例如,您将收到 key_load_public: invalid format
错误RSA 密钥。
根据 this GitHub issue,它应该通过 Windows 在 2020 年的某个时间更新来修复。因此,一种解决方案是等待更新发布。
如果您等不及了,解决方法是生成一个新的 ed25519 密钥,即 good advice anyway。
> ssh-keygen -o -a 100 -t ed25519
您可以将它与例如github,但一些较旧的系统可能不支持这种较新的格式。
生成密钥后,如果您正在使用以下任一功能,请不要忘记更新它们!
~\.ssh\config
可能仍指向旧密钥。- 通过
ssh-add
命令将新密钥添加到 ssh-agent
该错误具有误导性 - 它在指向私钥文件 ~/.ssh/id_rsa
.
pubkey
”
在我的例子中,它只是丢失了一个 public 密钥(因为我没有从保险库中恢复它)。
详情
我曾经跳过通过自动脚本部署 ~/.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 你的 post 终于把我引向了正确的方向 direction
:
简单地删除(实际上是重命名)public 密钥文件 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 format
和 read_passphrase: can't open /dev/tty
等错误。
正确的方法是使用
COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa
解决方案说明:我的私钥格式错误 - 而不是很多行,它作为一行传递,并且您可能有任何其他格式问题,例如忘记在开头或结尾的“-”,或者行尾有问题,比如缺少换行格式或行尾多了一个字母。
参见 Dockerfile: clone repo with passwordless private key. Errors: “authentication agent” or “read_passphrase: can't open /dev/tty” for more details, with the main idea from Add private key to ssh-agent in docker file, which again had the idea from Gitlab CI/Docker: ssh-add keeps asking for passphrase。
在 Git-hub 中添加 SSH-KEY:Windows
在 cmd 中输入:ssh-keygen -t ed25519 -C "your-email-id"
转到C:\Users\your-name\.ssh
在那里你会得到一个文件:id_ed25519.pub
打开该文件,复制它,转到 github->setting->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)
现在不用输入用户名密码也可以推拉