证书链下载与补全
「电脑上打得开,安卓 App 和 curl 却报错」,十有八九是服务器没把中间证书发全。这页会握一次手把服务端发的证书全部取回来,按签发关系排好序;缺中间证书时顺着证书里的 AIA 地址去 CA 那里抓回来补上,最后拼成可以直接替换上去的 fullchain.pem。
证书链的几件事
- 为什么浏览器能打开,客户端却报错
- Chrome、Edge 这类桌面浏览器会缓存以前见过的中间证书,还会自己按 AIA 去下载缺的那张,所以链不全也经常没事。Android 的老版本、Java、Go、curl、各种 SDK 都不做这件事,缺一张就直接失败,报
unable to get local issuer certificate或certificate signed by unknown authority。 - fullchain 的顺序不能乱
- RFC 5246 要求服务器证书排第一,后面依次是签发它的中间证书。顺序反了,OpenSSL 1.0.x 这类严格的客户端会直接拒绝。本页输出的已经排好,直接用即可。
- 根证书不用发
- 根证书必须由客户端自己信任才有意义,服务端发下来客户端也不会因此就信。多发一张只是每次握手多传一两 KB,在移动网络上是实打实的浪费。
- Let's Encrypt 的几个文件怎么对应
- certbot 生成的目录里,
cert.pem是服务器证书,chain.pem是中间证书,fullchain.pem是两者拼接,privkey.pem是私钥。nginx 的ssl_certificate要填 fullchain.pem,填成 cert.pem 就会出现本页说的那类问题。 - 这里的「验通/验不通」是按谁的信任库
- 按我们服务器上的系统根证书库(Debian 的 ca-certificates)判断。自签名证书、企业私有 CA 签的证书在这里一定显示验不通,但在导入了对应根证书的机器上是正常的。
- 相关工具
- 证书格式转换(本地拆分合并已有文件)、证书信息查看、SSL 证书检测、OCSP 吊销查询、证书私钥配对。