内部系统换了张新证书,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 可以装,但要走审批、留指纹、定期轮换。公网证书出问题,先查链,别先动客户端。