证书配好了,站点也能打开,可浏览器地址栏就是不出现那把锁,还挂着一条红色警告,点开一看写着「证书不受信任」。好多人第一反应是证书买错了、装错了,来回重装好几遍,问题还在原地。问题常常不在证书本身,而在它身后那条链子断了一节。证书链是什么?一句话讲,浏览器从你服务器上拿到的那张证书开始,一路往上追溯,直到它自己内置的某个根证书,这条路上的证书首尾相连,就是你这条链。中间缺一张,路就断了。

证书链是什么,用一条快递路线说清楚
服务器证书是发给你域名的那一张,排在最前面。它上面签名的是一张中间证书,中间证书上面签名的又是根证书。根证书不用你操心,浏览器和操作系统出厂就预置好了。你要管的,是把自己那张和中间那张一起发给浏览器。这就跟寄快递一样,光有收件人地址,没有中转站,包裹到不了。
为什么要分成三层,安全上的考虑大概是这样:根证书太重要,不能天天拿出来签东西,万一泄露就是整片信任体系受影响,所以中间架一层当缓冲。各家CA在具体套路上都略有差别,实际操作以服务商和官方页面说明为准,别拿一篇旧教程当圣旨。
中间证书,十有八九就断在这
从CA下载证书的时候,压缩包里往往不止一个文件。除了 yourdomain.crt 这种,还有 ca_bundle.crt、chain.crt 之类名字的文件。前面那个是证书本身,后面的是中间证书。有人图省事,只把前一个传上去,服务器照样启动,站点照样能开,看上去一切正常。然后换台电脑、换个手机、或者用某些工具一测,就露馅了。
不同浏览器的容忍度还不一样,这是最折腾人的地方。你本机测试全绿,客户那边打不开,来回扯皮半天,最后发现就是链没补全。桌面浏览器有些会自己去把中间证书抓回来缓存着,手机上就未必,很多 App 内置的客户端、某些抓取程序更严格,缺了就是不认。
少一环之后,浏览器到底在闹什么
表现大致几种。一种是直接拦截,整页变成警告页,用户得点「高级」再点继续才能进。一种是地址栏那把锁变灰或者带个感叹号,看着不舒服但还能用。还有一种最隐蔽,页面本身打开没问题,但里面加载的资源、调用的接口报错,你查前端查半天查不出来。再有一种是搜索引擎抓取失败,这个在服务器日志里能看到,一堆握手不成功的记录。
顺带提一句,证书过期、域名不匹配、链不完整,这三种报错长得特别像,处理方式却完全不同。先看清楚报错文案再动手,别上来就改配置。
用 openssl 一眼看穿链全不全
Linux 上敲一句:openssl s_client -connect 你的域名:443 -showcerts,回车。输出开头会把服务器返回的证书一张张列出来,编号 0、1、2 那么排下去。只有一张,基本就是缺链了。正常应该看到服务器证书加至少一张中间证书。往下翻还有一行 Verify return code,如果是 0 (ok),说明链在你这台机器上验通了。
更省事的办法是拿在线 SSL 检测工具跑一遍,输入域名,它会把整条链画出来,哪一层缺一目了然。工具归工具,最终判定还是以浏览器实际表现和服务商说明为准。
补链的几种方式,服务器和面板各不一样
nginx 的 ssl_certificate 指向的那个文件,最好本身就是合并好的,服务器证书在前,中间证书跟在后头,顺序别搞反。不少面板部署证书时给两个输入框,一个叫证书,一个叫证书链或者中间证书,两个都得填。只填第一个,等于只把话说了半截。
Apache 老版本是两个指令分开写,SSLCertificateFile 和 SSLCertificateChainFile;新版本把链合并进前者了。IIS 更绕一点,得先把中间证书导入到「中间证书颁发机构」里,再导出带链的 pfx。这些操作跟着软件版本和服务商文档走,别硬套。
合并文件时注意编码和换行。用编辑器手贴容易出现多余空行或者换行符被改掉,服务端读的时候直接报错。老老实实用 cat 拼,省事。
补完了还报错,先别急着重签
链补上了浏览器还警告,先核对几件事:证书是不是真的到期了;域名写的是带 www 还是不带 www,证书只覆盖其中一个的话,另一个照报不误;中间证书有没有拿错,有些CA不同产品线给的中间证书不是同一张;配置改完服务器 reload 了没有,不重启等于没改。
还有一个经常被忘掉的,CDN。源站配得再对,流量走了 CDN,浏览器看到的也是 CDN 节点上那张证书。这时候得去 CDN 控制台看证书部署状态,链也得在那边配齐。源站和边缘两头都要对,只改一边白忙活。
定期检查的笨办法最管用
证书这东西,装好之后平时没人惦记,一出事就是急事。设个日历提醒,到期前一个月去看一眼。或者写个小脚本每周跑一次 openssl 检查,结果发到自己邮箱。别嫌土,管用就行。
现在很多服务商提供自动续期、自动部署,能开就开。但开了也别完全撒手,自动续期失败的通知经常发到一个八百年不看的邮箱里,记得把通知地址换成你天天都会点开的那一个。
证书链这回事,说穿了就是个完整性的问题。该给的几张证书一张不少地送到浏览器手里,它自然就认了。少一环,你在配置上折腾再久、证书重装再多遍也是白费。下次再碰上「证书不受信任」的提示,先跑一句 openssl 数一数返回了几张证书,比什么都快。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!