证书不见了却能正常访问,到底谁在兜底?答案往往不在你自己那台服务器上。地址栏的小锁还亮着,你登进后台一看证书目录是空的,或者里面躺着一张早就过期的文件,网站照样打开,一点毛病没有。这种时候真正在跟浏览器握手的是链路上某一层你没太留意的设备,源站只是被绕过去了而已。

先搞清楚浏览器到底在跟谁握手
你在地址栏敲下域名,浏览器并不会直接连到你脑子里想的那台机器。DNS 先把你指到一个 IP,那个 IP 上坐着的是谁,很多人从来没查过——可能是 CDN 边缘节点,可能是负载均衡,也可能是一台专门做转发的反向代理。TLS 握手发生在浏览器和这个「第一个接客的人」之间,证书也是它递出来的。所以「源站证书没了」和「访问一切正常」这两句话根本不打架,它们说的压根不是同一个位置。
最常见的一种情形是:证书只装在了 CDN 那边,源站还是自签的、过期的、甚至压根没配。CDN 回源的时候有个选项叫忽略源站证书校验,很多人图省事一直开着,交接得挺顺,隐患也就一直留在那儿。
证书不见了却能正常访问到底谁在兜底,三层接力
排一排顺序基本就清楚了。第一层是 CDN 或者云上的证书托管,第二层是你自己架的反向代理,Nginx、Caddy、面板里那些一键 SSL 都算,第三层是浏览器自己的会话缓存和 HSTS 记录。这三层里任何一层手里攥着有效证书,用户那头看到的锁就是亮的,跟他实际访问到的源站有没有证书毫无关系。
有点像传话游戏。你在源站喊了一句「我没证书」,声音传到用户耳朵里已经被中间那层改成了「一切正常」。谁最后把证书递出去,谁就是兜底的那个,通常也是最容易被忘掉的那个。
CDN 和反向代理是最常见的隐形持证人
现在云厂商的证书托管基本是一键签发、一键部署、到期自动续,后台点完就再也没人管过。于是就出现一种挺别扭的状态:服务器上 /etc/nginx/ssl/ 翻出来是空的,或者里面躺着一张去年的 pem,网站一点事没有。因为真正对外提供服务的是边缘节点,源站只负责吐 HTML 和接口数据。
想确认前面是不是站着一层,看响应头就行。curl -I 一下,Server 字段、X-Cache、Via、CF-Ray 这些痕迹,各家叫法不一样,具体以服务商文档为准。有这些基本能断定你看到的「正常访问」是别人代劳的。还有个更土的办法:把域名解析临时指到另一个 IP 试试,我见过有人这么一测,网站当场挂了,才知道自己一直靠谁养着。
浏览器自己也会骗你半天
HSTS 和 TLS 会话复用这两样东西,能让一个其实不太安全的站点在你这台机器上看起来完好无损。HSTS 一旦被记住,浏览器在有效期内强制走 HTTPS,不给你降级的机会;证书真出问题的时候它甩出来的是一张红色拦截页,不是正常页面。所以你能看到正常内容,说明握手那一刻证书链是过得去的。
会话复用更隐蔽,短时间内复用上次的握手结果,风平浪静。换个从没访问过的浏览器、开个无痕窗口、或者拿手机流量走一遍,问题往往立刻现形。排查这种事,别只在一台机器一个浏览器上试。
还有一种可能:它压根没走 HTTPS
http:// 和 https:// 是两个世界。不少站点 http 还能打开,纯粹是没配跳转。你在地址栏敲域名不带协议,浏览器补的是 http,那当然畅通无阻,跟证书一个字的关系都没有。这种「正常访问」最坑,用户以为一切安好,其实全站明文传输,登录密码在链路上裸奔。
查这个用 curl -I http://你的域名,看返回是 200 还是 301、308。没跳转就补跳转,server 块里加一行 return 301 https://$host$request_uri; 就能解决,别拖。
两分钟验明正身
命令行的办法最干脆。openssl s_client -connect 你的域名:443 -servername 你的域名,输出里找 subject= 和 Issuer=,再看 Verify return code 是不是 0。带 -servername 很关键,同一个 IP 上挂多个站点时是 SNI 决定服务器递哪张证书给你,不带这个参数你看到的是默认那张,特别容易误判。
想看有效期,加 -dates,或者 echo | openssl s_client -connect 你的域名:443 -servername 你的域名 2>/dev/null | openssl x509 -noout -dates。curl 这边用 curl -vI https://你的域名,握手阶段会把证书链和到期时间都打出来。链不完整(缺中间证书)在桌面浏览器上常常看不出来,但安卓老机型、微信内置浏览器、部分 Java 客户端会直接报错,这类问题特别爱在换成新证书之后冒出来。
顺便提醒一句,「证书不见了」有时候不是真不见了,是 nginx 配置里 ssl_certificate 指到了别的文件路径,或者 fullchain.pem 和 privkey.pem 配错了对。cat 一下配置文件,比在面板里瞎点快得多。
有人兜底是运气,不是长久之计
源站证书该续还得续,该装还得装。道理不复杂:CDN 回源如果开着校验,源站证书一过期,回源直接失败,整站 502;反过来校验一直关着,等于给中间人留了门——用户到 CDN 这一段是加密的,CDN 到源站这一段是明文的,数据在公网上跑一圈,谁都可能看得见。
还有合规这一层。等保测评、支付通道对接、小程序审核这些场景,多数会要求全链路加密,具体口径各家不一样,以对方给的材料清单和官方页面说明为准,别自己拍脑袋估。
留一张自查小票
把证书到期日记进日历,提前一个月续;能用自动续期就用,acme.sh、certbot 都行,续完记得 reload 服务,光续不 reload 等于没续;CDN 和源站两头都装,别只装一头;回源校验能开就开,实在开不了就写个备注提醒自己。
下次再碰上「证书不见了网站还活得好好的」,别急着说自己撞大运。按顺序捋:浏览器在跟谁握手、响应头里有没有中间层、http 有没有跳 https、openssl 看到的是哪张证书。捋完基本就知道是谁在替你兜底,也就知道这层底还该不该继续兜下去了。
【版权声明】:本站内容若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!