错误信息
unable to load certificate
这是 OpenSSL 1.1.x 的措辞。OpenSSL 3.0 会先打印“Could not read certificate from cert.pem”,接着是首字母 U 大写的“Unable to load certificate”;OpenSSL 3.5 及更高版本打印“Could not find certificate from cert.pem”,外加一行 STORE routines 错误栈(已在 3.0.2 和 3.6.4 上复现)。措辞因版本而异,失败本身完全相同。
含义
openssl x509(或其他读取证书的命令)无法从文件中解析出证书。输入要么是另一种 PEM 对象(密钥、CSR),要么是不对的二进制编码,要么根本不是 X.509 结构的文本——命令根本没走到读取字段那一步。由于证书文件无论采用哪种编码都命名为 .crt 或 .cer,文件名在这里说明不了任何问题,只有字节内容才能说明。
原因
文件中是密钥或 CSR,而不是证书
常见BEGIN PRIVATE KEY、BEGIN PUBLIC KEY 或 BEGIN CERTIFICATE REQUEST 块都不是证书。尤其是 CSR,经常被误认为证书——CSR 是你发给 CA 的东西,CA 返回给你的才是证书。
DER 证书未加 -inform der
常见Windows 生态中的 .cer/.crt 文件常常是二进制 DER。OpenSSL 1.1 中的 openssl x509 默认按 PEM 读取,找不到 PEM 封装就会失败;OpenSSL 3 能自行识别 DER。
PKCS#7 / PKCS#12 打包文件
偶见.p7b 和 .pfx/.p12 文件是装有证书的容器,而不是单独的证书。需要先用各自对应的命令解包,x509 才能读取其中的内容。
修复方法
- 1.
先识别,再转换
检查标签或开头的几个字节;必要时把 DER 转换为 PEM。
bash head -1 cert.file # BEGIN what? openssl x509 -inform der -in cert.der -out cert.pem # DER → PEM - 2.
解包容器格式
从 PKCS#7 和 PKCS#12 打包文件中提取证书,保存为普通 PEM。
bash openssl pkcs7 -print_certs -in bundle.p7b -out certs.pem openssl pkcs12 -in bundle.pfx -clcerts -nokeys -out cert.pem - 3.
CSR 要用 req 命令
如果文件是证书请求,就用 req 查看——并且记住,它还需要由 CA 签名才能成为证书。
bash openssl req -in request.csr -noout -text