错误信息
Load key "/path/to/key": invalid format
路径按每次调用填入。措辞取决于构建 OpenSSH 时使用的密码学库:使用 OpenSSL 1.1 或 LibreSSL(macOS)时,下面列出的每种失败都会打印“invalid format”;使用 OpenSSL 3 构建的版本(Ubuntu 22.04 及更高版本、Debian 12 及更高版本)对其中大多数情况打印“error in libcrypto”,只有损坏的 PEM 格式密钥仍打印“invalid format”。如果密钥正文中有字符被改动,所有构建都会报出“unknown or unsupported key type”。
OpenSSH — ssh, ssh-keygen, ssh-add
含义
OpenSSH 尝试加载私钥文件,但无法用它支持的任何格式(OPENSSH PRIVATE KEY、PKCS#8、旧式 PEM)解析。文件已损坏、被截断、是 PuTTY 的 .ppk 这类外部格式,或者根本不是私钥——这是文件格式层面的失败,发生在任何密码短语处理或与服务器交互之前。
原因
复制粘贴损坏了密钥
常见经过聊天工具、电子邮件或终端传递的密钥,会丢失末尾的换行符、多出自动折行或智能标点,或者丢掉最后的短横线。OPENSSH PRIVATE KEY 块的 base64 正文对长度很敏感;丢失一个字符就会让整个文件失效。(仅仅缺少末尾换行符就是一个典型的诱因。)
在 OpenSSH 中使用了 PuTTY 的 .ppk 文件
常见PuTTY 的密钥格式(“PuTTY-User-Key-File-2: ...”)不是 OpenSSH 的格式。让 ssh -i 指向 .ppk 文件,恰恰会在这里失败;密钥需要转换一次。
在应该使用私钥的地方用了公钥
常见ssh -i id_ecdsa.pub(.pub 文件),或者把 authorized_keys 中的一行保存成了身份文件——私钥加载器读到的是公钥内容,于是报告“invalid format”。
文件被截断或只同步了一部分
偶见经云同步或因 scp 中断而在正文中途被截断的密钥文件,解析出来只是无意义的数据。已复现:截断一个有效的密钥文件,在 OpenSSH 8.4 和 macOS 上得到的正是“invalid format”。
修复方法
- 1.
先检查文件的首尾结构
查看第一行和最后一行,再做一次有效性探测(当且仅当私钥能被解析时,-y 才会打印出公钥),几秒钟内就能确定失败属于哪一类。
bash head -1 ~/.ssh/id_ecdsa # -----BEGIN OPENSSH PRIVATE KEY----- tail -c 50 ~/.ssh/id_ecdsa | xxd | tail -1 # must end with 0a (newline) ssh-keygen -y -f ~/.ssh/id_ecdsa # parses? prints the public key - 2.
将 PuTTY 密钥转换为 OpenSSH 格式
用 puttygen 转换一次;之后这个密钥就能用于 ssh、ssh-add 和 ssh-agent。
bash puttygen key.ppk -O private-openssh -o ~/.ssh/id_converted chmod 600 ~/.ssh/id_converted - 3.
无损地传输密钥
用 scp/rsync 而不是剪贴板传输密钥文件,保持权限为 600;如果私钥无法恢复,就生成新的密钥对——现代 OpenSSH 推荐使用 Ed25519。
bash scp -p old-host:~/.ssh/id_ecdsa ~/.ssh/ # or start clean: ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519