内部系统换了张新证书,Chrome 打开直接抛 NET::ERR_CERT_AUTHORITY_INVALID,后端 curl 调接口报 error 60: SSL certificate problem。运维说证书是刚买的。

证书链是三层:站点证书、中间证书、根证书。浏览器只校验最上面那个根在不在自己的信任库,中间证书得由服务器一起发下来。只配站点证书、漏掉中间证书,最常见。

一条命令看出缺没缺中间证书

openssl s_client -connect api.example.com:443 -servername api.example.com -showcerts,数 BEGIN CERTIFICATE 出现几次。只有一段就是缺中间证书,两段正常,三段连根也带上了。再验一遍:openssl verify -CAfile root.crt fullchain.crt。

Nginx 的 ssl_certificate 应该指向 fullchain 文件,也就是站点证书加中间证书拼在一起,ssl_certificate_key 才是私钥。Apache 用 SSLCertificateChainFile。改完 nginx -t 通过再 reload。

各端信任库分别在哪

  • Windows:certmgr.msc,受信任的根证书颁发机构,导入后重启浏览器
  • Debian/Ubuntu:根证书放 /usr/local/share/ca-certificates,执行 update-ca-certificates
  • RHEL/CentOS:放 /etc/pki/ca-trust/source/anchors,执行 update-ca-trust
  • Java:keytool -importcert -alias myca -file root.crt -keystore cacerts,默认口令 changeit
  • Python:requests 读 certifi 的包,或者 verify=/path/ca.pem 指定
  • curl:--cacert /path/ca.pem,别用 -k 糊弄过去

自签根证书的硬要求

基本约束里 CA 必须为 TRUE,keyUsage 要有 keyCertSign,否则签出的证书一律不认。根私钥离线保存。有效期别随手写 20 年,换根很麻烦。

该不该点继续访问

为了消一个黄色警告,把来路不明的根证书装进信任库,等于信任它签发的所有证书,中间人随时能解开你的流量。内网自建 CA 可以装,但要走审批、留指纹、定期轮换。公网证书出问题,先查链,别先动客户端。