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

Flo*_*wig 26 linux ssh ssh-agent

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

$ ssh-add ./id_rsa
Error loading key "./id_rsa": invalid format
Run Code Online (Sandbox Code Playgroud)

将密钥复制到干净的 VM 中,密钥确实有效。即使使用完全相同的 ssh 版本(Fedora 28 上的 OpenSSH_7.8p1、OpenSSL 1.1.0i-fips 2018 年 8 月 14 日)。所以它必须与我假设的系统上的一些配置有关。

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

...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

同样奇特的是:GNOME 以某种方式设法在使用 seahorse 登录时添加密钥。然后ssh-add -L确实列出了密钥但它不可用:

sign_and_send_pubkey: signing failed: agent refused operation
Run Code Online (Sandbox Code Playgroud)

use*_*686 23

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

所以问题可能是以下之一:

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

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

    openssl rsa -noout -text < id_rsa
    openssl pkey -noout -text < id_rsa
    
    Run Code Online (Sandbox Code Playgroud)

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

    umask 077
    openssl pkey < id_rsa > id_rsa.pkcs8
    ssh-add id_rsa.pkcs8
    
    Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

同样奇特的是:GNOME 以某种方式设法在使用 seahorse 登录时添加密钥。

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


小智 19

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

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


Kam*_*mil 9

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


Ily*_*sev 5

就我而言,我只是复制了 id_rsa 私钥,但没有复制公共部分 id_rsa.pub。它有效,但每次我进行服务器操作时都会抱怨“格式无效”。复制 id_rsa.pub 也解决了问题。