由于某种原因,我的一个 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 格式。)
因此问题可能是以下之一:
您的 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
您的 OpenSSH 构建时未包含 OpenSSL 支持。尽管
ssh -V
显示已启用支持,但并不意味着二进制文件ssh-add
是相同的 – 它可能来自不同的部分安装。使用
type -a ssh
和type -a ssh-add
比较安装位置。一旦知道路径,就用它
ldd /usr/bin/ssh-add
来验证它是否链接到libcrypto.so
(OpenSSL 加密库)。
如果什么都不起作用,请尝试使用 PuTTY 将您的密钥转换为新的 OpenSSH 专有格式。安装putty
Fedora 软件包,然后使用:
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 继续工作,但令人困惑的是却出现了同样的错误。
这个问题可以通过删除无效的(在我的情况下是零大小的)证书文件或根据情况用有效的证书替换它来修复。