ssh:加载密钥“./id_rsa”时出错:格式无效

ssh:加载密钥“./id_rsa”时出错:格式无效

由于某种原因,我的一个 ssh 密钥“坏了”——它停止工作了:

$ ssh-add ./id_rsa
Error loading key "./id_rsa": invalid format

在干净的虚拟机内复制密钥,密钥确实有效。即使使用完全相同的 ssh 版本(OpenSSH_7.8p1、OpenSSL 1.1.0i-fips 2018 年 8 月 14 日,Fedora 28 上)。所以我猜想这一定与我系统上的某些配置有关。

# cat ./id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,...

...
-----END RSA PRIVATE KEY-----

同样奇怪的是:GNOME 不知怎么设法在使用 seahorse 登录时添加了密钥。然后ssh-add -L列出了密钥,但无法使用:

sign_and_send_pubkey: signing failed: agent refused operation

答案1

传统上,OpenSSH 使用的私钥格式与 OpenSSL 使用的旧 PEM 格式相同。(因为它使用 OpenSSL 来解析密钥,所以它也会接受较新的 PKCS#8 格式。)

因此问题可能是以下之一:

  1. 您的 OpenSSL 版本拒绝加载此密钥格式。也许它意外启用了 FIPS 模式并拒绝除其原始 FIPS 验证部分之外的任何算法?

    尝试将密钥加载到openssl命令行工具中(是的,它也可能链接到不同的库加密,你应该检查一下LDD):

    openssl rsa -noout -text < id_rsa
    openssl pkey -noout -text < id_rsa
    

    尝试将其转换为 PKCS#8 格式:

    umask 077
    openssl pkey < id_rsa > id_rsa.pkcs8
    ssh-add id_rsa.pkcs8
    
  2. 您的 OpenSSH 构建时未包含 OpenSSL 支持。尽管ssh -V显示已启用支持,但并不意味着二进制文件ssh-add是相同的 – 它可能来自不同的部分安装。

    使用type -a sshtype -a ssh-add比较安装位置。

    一旦知道路径,就用它ldd /usr/bin/ssh-add来验证它是否链接到libcrypto.so(OpenSSL 加密库)。


如果什么都不起作用,请尝试使用 PuTTY 将您的密钥转换为新的 OpenSSH 专有格式。安装puttyFedora 软件包,然后使用:

puttygen id_rsa -o id_rsa.newformat -O private-openssh-new
ssh-add id_rsa.newformat

同样奇怪的是:GNOME 不知何故设法在使用海马登录时添加了密钥。

较旧的 GNOME Keyring 版本具有 SSH 代理代码的内部副本,并且独立于系统 OpenSSH。因此它们将接受您的 OpenSSH 不会接受的密钥。(但另一方面,这意味着在功能支持方面严重滞后(例如 Ed25519 密钥),而最新的 GNOME Keyring 仅使用系统 ssh-agent。)

答案2

当我通过 Gitlab 中的 CI 管道变量传递私钥时,我收到了相同的错误消息。

该错误是由于变量末尾没有换行符引起的,可以通过手动添加来修复。

答案3

就我而言,问题是由 id_rsa 文件中的行尾字符不正确引起的。复制文件内容后,Windows 文本编辑器想帮助我,并将 EOL 转换为 CR LF。

答案4

我最近遇到了这个问题,在我的情况下,这是因为有一个无效的证书(即$HOME/.ssh/id_rsa-cert.pub),尽管我的私钥仍然有效并且 SSH 继续工作,但令人困惑的是却出现了同样的错误。

这个问题可以通过删除无效的(在我的情况下是零大小的)证书文件或根据情况用有效的证书替换它来修复。

相关内容