CDN 上传证书提示“不匹配”,绝大多数是三类问题之一:证书与私钥不成对、证书未覆盖你配置的域名(含 SAN 字段缺失)、证书链不完整或文件格式不对。按下面三步用 openssl 逐项排查,基本 5 分钟内能定位。
CDN 提示“证书不匹配”通常是哪几种原因?
结论:CDN 后台的“不匹配”是一类笼统的错误提示,实际可能对应私钥不配对、域名不在证书覆盖范围、证书链缺失、编码格式错误四种情况,不同厂商给出的报错文案不同但排查路径一致。
第一种是证书与私钥不成对,也就是上传的 .key 与 .pem 根本不是同一次签发产出的那一对;第二种是域名不匹配,你加速域名是 img.example.com,证书里只有 example.com;第三种是只上传了站点证书,没有把中间证书一起拼接;第四种是文件被记事本改过,带上了 UTF-8 BOM 或 CRLF 换行。
先确认你上传的是 PEM 文本格式(以 -----BEGIN CERTIFICATE----- 开头),而不是被 base64 包了一层的 DER 二进制或 .pfx。
怎么用 openssl 三步定位是证书、私钥还是链的问题?
结论:三条命令即可把问题范围缩小到唯一一项——先比对公钥指纹,再看 SAN 字段,最后验证链。
第一步,比对证书和私钥是否成对(RSA 证书):
openssl x509 -in cert.pem -noout -modulus | openssl md5
openssl rsa -in key.pem -noout -modulus | openssl md5
两行输出的 32 位 md5 必须完全相同,不同就是拿错了私钥。如果证书是 ECC(ECDSA 椭圆曲线算法),modulus 命令会报错,改用公钥指纹比对:
openssl x509 -in cert.pem -noout -pubkey | openssl md5
openssl pkey -in key.pem -pubkey -noout | openssl md5
第二步,看证书到底覆盖了哪些域名:
openssl x509 -in cert.pem -noout -text | grep -A1 "Subject Alternative Name"
第三步,验证链是否完整:
openssl verify -untrusted chain.pem cert.pem
返回 cert.pem: OK 才算通过,报 unable to get local issuer certificate 就是缺中间证书。
证书和私钥不匹配怎么处理?
结论:不要试图“修复”已有的私钥,直接回到签发处重新导出配对的一对文件,这是唯一可靠的做法。
证书和私钥是数学上绑定的一对,私钥丢了或选错了,任何编辑手段都补救不了。正确做法是:在证书签发平台或服务器上,找到与该证书同一批次生成的私钥文件;如果私钥已丢失,只能重新签发(免费证书直接重新申请,付费证书走重签流程,DV 证书通常几分钟出证,OV/EV 需要重新审核)。
另外注意:不要把另一张证书的私钥拼到这张证书后面“凑数”,部分 CDN 会因为这个静默降级到 HTTP,反而更隐蔽。
域名不匹配怎么处理?
结论:证书的 SAN(Subject Alternative Name,备用名称)字段必须完整包含你填写的加速域名,通配符证书只覆盖一级子域。
几个常见坑:
- 通配符
*.example.com 只匹配 a.example.com,不匹配 a.b.example.com,也不匹配裸域 example.com(裸域需要单独把 example.com 加进 SAN)。
- 一张证书有多个域名时,上传后要在 CDN 的域名绑定里逐个添加,漏绑的域名仍然报不匹配。
- 泛域名证书签好后新增子域不用重签,但新加的业务域名(如
example.net)必须重签或换证书。
处理办法是先按上一步打印出 SAN 列表,逐条对照你的加速域名,确认后再去 CDN 后台改绑定关系而不是反复重传。
证书链不完整或格式错误怎么处理?
结论:CDN 要的是“站点证书 + 中间证书”按顺序拼接的单个 PEM 文件,顺序反了或少了中间证书都会报不匹配。
拼接顺序是站点证书在前,中间证书在后:
cat cert.pem intermediate.pem > fullchain.pem
然后把 fullchain.pem 作为证书、key.pem 作为私钥上传。根证书通常不需要包含,包含部分平台反而会拒绝。
如果是 .pfx / .p12 文件,先转成 PEM:
openssl pkcs12 -in cert.pfx -nodes -out all.pem
输出文件里会依次包含私钥、站点证书、中间证书,按注释行 Bag Attributes 和 BEGIN 标记拆开即可。
格式上还有两个细节:私钥用 PKCS#1(BEGIN RSA PRIVATE KEY)还是 PKCS#8(BEGIN PRIVATE KEY),部分 CDN 只认其中一种,转换命令是 openssl pkcs8 -topk8 -nocrypt -in old.key -out new.key;文件末尾必须保留换行,且全程用 LF 换行,用记事本另存为会引入 BOM 导致解析失败,建议用 VS Code 或 sed -i 's/\r$//' file.pem 清理。
上传后仍报错要检查什么?
结论:后台显示上传成功但访问仍报证书错误,问题在回源或缓存层,不在证书本身。
用 openssl s_client -connect cdn.example.com:443 -servername cdn.example.com 看实际下发的证书链,如果返回的不是你刚上传的那张,通常是 CDN 节点缓存未刷新,等 5~30 分钟或手动刷新证书配置;如果只下发了一张证书,说明链没生效。
另外确认 CDN 后台的 HTTPS 开关是否真的打开了——部分平台证书上传成功与 HTTPS 启用是两个独立步骤。
收尾一句:证书不匹配本质是“配对、域名、链路、格式”四个维度的校验,用 openssl 的 modulus 比对、SAN 打印、verify 验证三条命令定位,比反复重传文件高效得多。