【问题标题】:key_load_public: invalid formatkey_load_public:格式无效
【发布时间】:2017-08-09 09:19:24
【问题描述】:

我使用 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 中添加新行而不是添加新行

【问题讨论】:

  • 为什么你认为它不起作用?它说已成功验证
  • @RolandSmith 它告诉我key_load_public: invalid format 就在我输入密码之前执行命令时?
  • Do: 'ssh -vvv -T git@github.com' 以获得更多信息,可能 ~/.ssh/known_hosts 不好 - ssh 正在寻找 github 的公钥。您可以运行“文件密钥”来找出密钥文件的格式。

标签: git github ssh public-key


【解决方案1】:

在 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

粘贴你复制的密钥

完成!!

【讨论】:

    【解决方案2】:

    我在尝试时遇到了类似的错误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

    【讨论】:

      【解决方案3】:

      @uvsmtid 你的帖子终于把我引向了正确的direction: 简单地删除(实际上是重命名)公钥文件id_rsa.pub 为我解决了这个问题,虽然 git 正在工作,但一直在抱怨 invalid format。 不太确定,但实际上并不需要该文件,因为无论如何都可以从私钥文件 id_rsa 中提取 pub 密钥。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          如果您使用的是带有内置 SSH 的 Windows 10,则自 2020 年 8 月起,它仅支持 ed25519 密钥。如果您使用例如,您将收到 key_load_public: invalid format 错误。一个 RSA 密钥。

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

          如果你等不及了,一个解决方法是生成一个新的 ed25519 密钥,即good advice anyway

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

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

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

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

          【讨论】:

            【解决方案6】:

            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 的输出复制并粘贴到文本编辑器中是解决此问题的最简单方法。

            附:这可能是对the accepted answer 的补充,但我还没有足够的业力在这里发表评论。

            【讨论】:

            • 如您所见,管道在 Powershell 中的工作方式不同。你可以改用ssh-keygen -f ~/.ssh/id_rsa -y | ac ~/.ssh/id_rsa.pub
            【解决方案7】:

            所以,更新后我遇到了同样的问题。我使用 PEM key_file 没有扩展名,只需添加 .pem 即可解决我的问题。现在文件是key_file.pem

            【讨论】:

              【解决方案8】:

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

              第 1 步: 下载最新的puttygen并打开p​​uttygen

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

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

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

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

              【讨论】:

              • 当我使用 Export OpenSSH key 导出密钥时,我收到了 load pubkey invalid format 警告。使用 Export OpenSSH key (force new file format) 时它消失了。
              • 在 linux 中,apt install putty-toolsyum install putty 然后 sudo puttygen private.ppk -O private-openssh-new -o private.pem
              【解决方案9】:

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

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

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

              格式

              Link to the relevant PuTTY documentation

              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 授权密钥文件中的公钥”的文本框中。要将其保存为文件,您必须手动将其从文本框中复制并粘贴到新的文本文件中。

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

              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 私钥实际上被另一个程序使用的副作用。我已将语言“最好是无扩展名”更改为“(没有扩展名)”以消除任何歧义。每当我回顾这个答案时,我也借此机会重新表达了一些不满。感谢您的贡献。
              • 感谢您的回答。我在您的答案“重新生成公钥”部分使用了命令,它解决了我的问题。
              • ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub 这解决了它。谢了!
              • 非常有帮助,您节省了我的时间...... :-D 我遵循重新生成公钥,并让我工作。
              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

                不要直接保存私钥,而是转到转换和导出 SSH 密钥。 有同样的问题,这对我有用

                【讨论】:

                  【解决方案12】:

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

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

                  【讨论】:

                    【解决方案13】:

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

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

                    【讨论】:

                    • 简而言之,转到 putty key gen,单击转换 -> 打开 ssh 密钥并将其保存到 id_rsa - 确保您的 HOME env 变量指向您正在查看的 .ssh 文件夹,删除所有您系统中 id_rsa 文件的其他副本
                    • 这个答案是我的解决方案。在ssh key_load_public: invalid format warning 上查看相同的答案。您应该重命名或删除客户端上的公钥,因为客户端上无论如何都不需要它,并且它似乎被检查为私钥,因为它的名称相同(只是扩展名为“.pub”)。跨度>
                    猜你喜欢
                    • 1970-01-01
                    • 2017-05-14
                    • 1970-01-01
                    • 2014-08-15
                    • 2015-01-22
                    • 2020-08-16
                    • 2010-10-31
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多