key_load_public:格式无效

时间:2017-03-17 17:37:28

标签: git github ssh public-key

我使用PuTTY密钥生成器生成带密码的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.

问题是什么?

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

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

13 个答案:

答案 0 :(得分:105)

作为答案中提到的Roland,警告ssh-agent不了解公钥的格式,即使这样,公钥也不会在本地使用。

但是,我也可以详细说明并回答警告的原因。它简单地归结为 PuTTY密钥生成器生成两种不同的公钥格式,具体取决于您在程序中执行的操作。

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

格式

Link to the relevant PuTTY documentation

SSH-2

使用“保存公钥”按钮使用 PuTTY Key Generator 保存键时,它将以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 authorized_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. 在菜单栏上,点击“文件”&gt; “加载私钥”
  3. 选择您的id_rsa.ppk文件
  4. 在菜单栏上,点击“转化次数”&gt; “导出OpenSSH密钥”
  5. 将文件另存为id_rsa(不带扩展名)
  6. 现在您已拥有OpenSSH私钥,您可以使用上面的ssh-keygen工具对密钥执行操作。

    Bonus: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
    

    参考文献:

答案 1 :(得分:9)

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

我遇到了同样的问题,但是单独的the accepted answer不能工作,因为文本编码是另外一个容易错过的问题。

我跑步时

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

在Windows PowerShell中,它以 UTF-16 LE BOM 编码而不是 UTF-8 将输出保存到id_rsa.pub。这是某些安装的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。这可能是对the accepted answer的补充,但是我在这里没有足够的业力可以发表评论。

答案 2 :(得分:5)

似乎ssh无法读取您的公钥。但这并不重要。

您将公钥上传到github,但您使用私钥进行身份验证。参见例如ssh(1)中的FILES部分。

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

代替直接保存私钥,请转到“转换和导出SSh密钥”。 遇到同样的问题,这对我有用

答案 5 :(得分:1)

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

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

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

Load an existing private key

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

enter paasphrase

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

save OpenSSH file

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

答案 6 :(得分:1)

该错误具有误导性-指向私钥文件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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

如果您将Windows 10与内置SSH一起使用,则截至2020年8月,它仅支持ed25519密钥。如果您使用例如,会出现d2错误。 RSA密钥。

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

如果迫不及待,一种解决方法是生成一个新的ed25519密钥,即good advice anyway

d2-d1

您可以将其与例如github,但某些较旧的系统可能不支持此新格式。

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

  1. d1 = {'Rash': '80000000', 'Kil': '80000020', 'Varsha': '80000020', 'sam': '80010000'} d2 = {'Varsha': '8000ffe0', 'sam': '80014000', 'Kil': '8000ffe0', 'Rash': '801fffff'} d3 = {key: d2[key] - d1.get(key, 0) for key in d2} print(d3) 可能仍指向旧密钥。
  2. 通过key_load_public: invalid format命令将新密钥添加到ssh-agent

答案 10 :(得分:0)

@uvsmtid 您的帖子终于让我找到了正确的 direction: 简单地删除(实际上是重命名)公钥文件 id_rsa.pub 对我来说解决了这个问题,尽管 git 一直在抱怨 无效格式。 不太确定,但实际上并不需要该文件,因为无论如何都可以从私钥文件 id_rsa 中提取公钥。

答案 11 :(得分:0)

我尝试时遇到了类似的错误 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: clone repo with passwordless private key. Errors: “authentication agent” or “read_passphrase: can't open /dev/tty”,其主要思想来自 Add private key to ssh-agent in docker file,其思想再次来自 Gitlab CI/Docker: ssh-add keeps asking for passphrase

答案 12 :(得分:0)

在 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

粘贴您复制的密钥

完成!!