浏览器地址栏一红,弹一句「您的连接不是私密连接」,很多人的第一反应是证书坏了,急着重签重装。先别动手——SSL错误和证书错误区别没分清,装十遍照样报错。这两类问题看着都长在 https 上,实际上一个是握手没谈成,一个是证书本身没过验。方向反了,越查越远,一天时间就这么填进去了。

SSL错误和证书错误区别:一个在握手,一个在验身份
TLS 握手你可以想成两个人隔着门对暗号:先问对方支持哪几套暗号(协议版本、加密套件),交换随机数,然后各自从门缝里把证件递出去(证书),再验证对方身份,谈妥了才开始传数据。证书校验只是其中一环。
所以两者的关系是——证书错误属于 SSL 错误的一种,SSL 错误覆盖面更大。证书过期、域名对不上、证书链不全,算证书错误;协议版本对不上、服务器只认老套件、明文 HTTP 打到了 443 端口、SNI 没匹配到对应站点,这些也都会被浏览器糊成同一句「不是私密连接」,但跟证书本身半点关系没有。
分清这层包含关系有个直接好处:报错能落到具体证书问题上(过期、名字不匹配),就改配置或换证书;报错含糊、连证书都取不出来,先怀疑端口、协议和中间设备,别在证书上死磕。
浏览器那串报错码,本身就带着线索
提示语长得一样,点开「高级」或者看控制台,线索就出来了。ERR_CERT_DATE_INVALID 是证书过期;NET::ERR_CERT_AUTHORITY_INVALID 是签发者不被信任,自签证书、根证书没装、中间证书缺失都可能归到它;NET::ERR_CERT_COMMON_NAME_INVALID 是名字对不上,证书里压根没这条域名。
另一头,ERR_SSL_PROTOCOL_ERROR 基本跟证书无关,常见于用 https 去敲只监听 http 的端口,或者反向代理把协议传错了;ERR_SSL_VERSION_OR_CIPHER_MISMATCH 是版本或套件谈不拢;SSL_ERROR_RX_RECORD_TOO_LONG 名字唬人,多数情况是把 https 请求发到了 80 端口。各家浏览器措辞有差别,看代码比看中文提示准。
一条 openssl 命令,先分清是哪一类
手上没有图形界面的时候,我一般先敲这条:openssl s_client -connect www.example.com:443 -servername www.example.com,重点看输出里的 Verify return code。0 (ok) 说明链验过了,问题多半在协议层或中间层;20 是取不到本地颁发者,通常中间证书没配全;10 是过期;62 是主机名不匹配。顺手看一眼 Subject 和 SAN 那几行,证书覆盖了哪些域名一目了然。
这条命令还有个用处:能看出服务器到底吐了什么证书出来。如果连证书都拿不到,握手在更早的阶段就断了,那就不是证书的锅,顺着端口、防火墙、监听去看。curl -vI https://www.example.com 也能看个大概,报错里会写卡在哪一步。
证书错误的三张老面孔:过期、名字不对、链不全
证书这条线上栽跟头,翻来覆去就那么几样。一是过期,免费证书有效期短,自动续期没跑通,到期当天准时翻车,日历上记一笔比什么监控都实在。二是名字不对,最常见的是给裸域签了证书、用户偏偏用 www 访问,或者反过来;通配符 *.example.com 只覆盖一级,a.b.example.com 它管不了。签之前把要用的域名全列一遍,别等上线才发现漏一个。
三是链不全。服务器上配的是单张证书而不是完整链(fullchain),桌面浏览器有时靠缓存能补上,手机和老设备直接报不受信任。Nginx 里 ssl_certificate 指向的应该是证书加中间证书拼起来的那个文件,这点最好在配置文件里写死。
SSL错误的坑,多半在配置和中间层
接了 CDN、SLB 之后这类问题特别多。回源协议写错,CDN 到源站用 https 而源站只开了 80,握手直接失败;端口搞混,443 上跑着 http 服务,或者安全组只放了 80,外面根本连不上;证书和私钥不是一对,换证书只换 crt 忘了换 key,服务重启起不来,错误日志里会留 key values mismatch 这类字眼;TLS 版本卡太死,只留 1.2 以上是对的,但一些老客户端、老爬虫连不上,报出来的也是 SSL 错误。
具体到某家 CDN 或负载均衡的开关叫什么名字、默认值是什么,各家控制台差别不小,以服务商或官方页面说明为准,别照着别人的截图硬套。
排查顺序照着走,别一上来就重签证书
顺序错了,时间全浪费在重装上。我的习惯:先确认域名解析指向的是源站还是 CDN,别在源站折腾半天、用户走的却是另一条路;再确认 443 端口通不通,安全组、防火墙、本机监听一起看;然后用刚才那条 openssl 把证书取回来,看有效期、SAN、签发链;接着翻服务端错误日志,像 /var/log/nginx/error.log 这类文件里写的失败原因比浏览器清楚得多;再看客户端,系统时间不准、公司网络做了 https 拦截、浏览器缓存了旧证书,都会让你误判;最后才动证书本身,重签、换链、重载服务。
什么时候换证书,什么时候改配置就够
判断标准不复杂。有效期到了、域名列表缺了、签发者不被信任,这三样只能换证书,配置怎么改都没用。链不全、私钥配错、文件路径写错、TLS 版本设得太严,都是配置问题,改完 reload 就行,证书本身没毛病。还有一种容易误判的:内网自签证书在浏览器里永远红,它天生不被公共信任,业务上要么把根证书装到客户端,要么换成公共 CA 签的,别在这上面反复重装。
下次再碰上地址栏变红,先看错误码,再跑一条 openssl,把「握手失败」和「证书验不过」分开摆。这一步花不了几分钟,省下的是后面一堆无头苍蝇式的重装。真拿不准,就把 openssl 的完整输出和服务端日志一起翻,答案基本都写在里面。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!