错误信息
unable to load Public Key
这是 OpenSSL 1.1.x 的措辞,也仍是被引用最多的形式。OpenSSL 3.0 打印“Could not read key of Public Key from cert.pem”,OpenSSL 3.5 及更高版本打印“Could not find private key of Public Key from cert.pem”(已在 3.0.2 和 3.6.4 上复现)——失败相同,只是说法变了。
含义
openssl 命令尝试从你指定的文件中读取公钥,但没有找到任何它能识别为公钥的内容。文件本身存在——问题在于其内容:可能是另一种对象(证书、私钥、SSH 密钥),可能编码不对,也可能根本不是密钥。
原因
文件是证书,而不是裸密钥
常见“-----BEGIN CERTIFICATE-----”是一张 X.509 证书,它包含公钥,但本身不是公钥。需要裸 SPKI 的命令(-pubin)会拒绝它;必须先把密钥提取出来。
需要 PEM 的地方给了 OpenSSH 密钥
常见“ecdsa-sha2-nistp256 AAAA... user@host”这样的单行条目(authorized_keys 格式)是 OpenSSH 自己的编码,不是 PEM/DER。不经转换,OpenSSL 无法读取。
带 -pubin 传入了私钥
常见-pubin 标志声明输入是公钥。在这个标志下,OpenSSL 1.1 和 3.0 会拒绝“-----BEGIN PRIVATE KEY-----”——去掉该标志,或者先推导出公钥部分。(OpenSSL 3.5 及更高版本会悄悄改为读取其中的公钥部分。)
把 DER 文件当作 PEM 读取
偶见在 OpenSSL 1.1 中,二进制的 .der/.cer 文件需要加 -inform der:按 PEM 解析二进制数据时找不到 BEGIN 行,于是失败。OpenSSL 3 能自行识别 DER。
修复方法
- 1.
从证书中提取密钥
一条命令就能生成 -pubin 类命令所需的 SPKI 公钥 PEM。
bash openssl x509 -in cert.pem -pubkey -noout > pubkey.pem openssl pkey -pubin -in pubkey.pem -noout -text # now loads - 2.
把 OpenSSH 密钥转换为 PEM
ssh-keygen 可以把 authorized_keys 格式的条目导出为标准的 BEGIN PUBLIC KEY(SPKI)PEM——ssh-keygen 把这种格式称为 PKCS8。
bash ssh-keygen -f id_ecdsa.pub -e -m pkcs8 > pubkey.pem - 3.
从私钥推导出公钥部分
如果文件实际上是私钥,就不要用 -pubin,而是推导出公钥。
bash openssl pkey -in private.pem -pubout -out pubkey.pem