错误信息
Load key "/path/to/key": error in libcrypto
也可能输出为
- error in libcrypto
路径是你所用的密钥文件。有些损坏会改为产生“Load key "…": invalid format”(例如 PEM 密钥中间缺了一行);两者的原因有重叠。
OpenSSH (ssh, ssh-add, ssh-keygen, git over SSH) — key file could not be parsed
含义
OpenSSH 无法按自己的格式解析私钥文件,于是把它当作 PEM 密钥交给 OpenSSL(libcrypto),结果同样失败——因此报告的错误是笼统的“error in libcrypto”,而不是具体原因。在当前的 OpenSSH 中(已在 10.0 上核实),`OPENSSH PRIVATE KEY` 文件几乎任何形式的损坏都会落到这里:Windows 换行符、缺少末尾换行符、丢了一行,或者密钥被压成了一行。损坏的 PEM/PKCS#8 密钥在被截断或压成一行时也会落到这里,PuTTY 的 `.ppk` 文件同样如此。
原因
Windows 换行符(CRLF)
常见粘贴到 CI 机密字段中、在 Windows 上编辑过,或者在启用 `core.autocrlf` 时检出的密钥,会带上 `\r\n` 换行符。这样一来,OpenSSH 格式的密钥就会解析失败。
末尾的换行符被去掉了
常见许多机密存储以及 `echo -n`/`$(...)` 之类的写法会丢掉末尾的换行符。对 OpenSSH 格式的密钥来说,仅这一点就会导致加载失败。
行丢失、被截断或被合并
常见把换行符压缩成空格的环境变量、从聊天工具中复制粘贴,或者截断密钥的大小限制。
不是 OpenSSH 或 PEM 密钥
偶见作为身份文件提供的 PuTTY `.ppk` 文件、公钥、证书或 JWK,都不是 OpenSSH 能读取的私钥。
修复方法
- 1.
逐字节准确地写入 CI 密钥
去掉 `\r`,以换行符结尾,把权限设为 600,并立即用 `ssh-keygen -y` 测试,让损坏的机密在准备步骤中就明确报错。
bash # CI: write the key exactly, normalise line endings, guarantee the final newline, restrict permissions install -d -m 700 ~/.ssh printf '%s\n' "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keygen -y -f ~/.ssh/id_ed25519 > /dev/null && echo "key parses" - 2.
检查文件的首尾结构
`file` 命令的输出、第一行和最后几个字节,能立即暴露 CRLF 换行符、缺失的换行符或被压成一行的密钥。
bash file ~/.ssh/id_ed25519 # "OpenSSH private key" vs "with CRLF line terminators" head -1 ~/.ssh/id_ed25519; tail -c 40 ~/.ssh/id_ed25519 | od -c | tail -3 # framing and final "\n" wc -l ~/.ssh/id_ed25519 # a one-line file means the newlines were lost