不是有效的 OPENSSH 私钥文件
你尝试通过 SSH 自动化 WordPress 维护。结果收到了这个错误:
SSHException: not a valid OPENSSH private key file.
你检查了密钥文件,看起来是正确的。问题不在于你的密钥,而在于库。
当 Paramiko 遇到 OpenSSH 格式以外的密钥时会失败。托管提供商和工具会生成许多不同的格式,而 Paramiko 经常会拒绝它们。
我们构建了一个兼容层来处理七种不同的格式:
- OpenSSH 新格式
- PKCS#1 RSA
- SEC 1 EC
- PKCS#8 明文
- PKCS#8 加密
- 旧版 PEM 加密
- PuTTY .ppk (v2 和 v3)
Paramiko 可以处理 OpenSSH 和 PKCS#1。但在处理 PKCS#8 和 .ppk 文件时会失败。例如,Sakura Internet 生成的 ECDSA 使用的是 PKCS#8 格式,Paramiko 会立即拒绝它。
我们的解决方案采用“检测、归一化、移交”的方法。
- 检测 (Detect):系统检查前几个字节和 PEM 标头以确定格式。
- 归一化 (Normalize):我们使用
cryptography库来读取密钥,然后将其重写为与 OpenSSH 兼容的 PEM 格式。 - 移交 (Hand-off):Paramiko 接收密钥。对于 Paramiko 来说,它看起来始终是标准的 OpenSSH 格式。
我们为 PuTTY .ppk 文件编写了自定义解析器。这保持了代码的轻量化,避免了增加二进制文件大小的额外依赖。
我们还修复了错误信息。模糊的错误会导致大量的支持工单。现在,当发生故障时,我们会提供三项数据:
- 接收到的格式是什么。
- 我们接受哪些格式。
- 你下一步应该怎么做。
当你为库构建一个吸收层(absorbing layer)时,库的局限性就会消失。这一层可以让不同的格式在你的应用程序看来是完全一致的。