网站显示错误的证书?先找到监听者
网站呈现了意外的证书,而显眼的文件却被重写。先确认是哪个监听者和虚拟主机最先应答。
在 Web 主机上安装 VPN 软件可能重排服务,但一张意外的证书并不能证明 Apache 的文件被改写。总有某个东西把那张证书呈现给了你的浏览器,第一件事就是给它命名。在监听者和虚拟主机被确认之前,任何修复都是施加在错误层面上的猜测。下面整套检查都是只读的。
在收集决定案情的事实期间,不重启、不卸载、不覆盖任何东西。
读取浏览器实际拿到的证书
记录主机名、每个地址族解析出的地址、端口,以及浏览器报怨的证书细节。一个同时解析到 A 和 AAAA 记录的名字可能抵达两个不同的前端,而其中只有一个才是你有 shell 访问权限的主机。代理后面的浏览器还可能再走第三条路。猜是哪一条产生了警告,等于浪费你唯一的一次观察。
然后从同一路径上的机器复现握手,明确指定地址并发送预期的服务器名,让应答反映站点而不是默认主机。
openssl s_client -connect 198.51.100.37:443 -servername www.example.net </dev/null 2>/dev/null |
openssl x509 -noout -subject -issuer -fingerprint -sha256 -ext subjectAltName
把主体备用名称和指纹与你预期的证书比对,而不是与熟悉签发者比对。不带服务器名地连接裸地址可能选中一张默认证书,那时看起来像错误的文件,实际是问题问错了。
确认绑定在该端口上的进程
在应当接收连接的主机上列出监听者,记下绑定地址、地址族和进程属主。绑定在回环地址上的服务与绑定在所有接口上的服务并不相同,而容器的发布可能把公开监听者放到完全别处。
sudo ss -ltnp 'sport = :443'
sudo ss -ltnp | grep -E ':(443|943)\b'
如果 TLS 由前置的负载均衡器或代理终结,就停在这里,转而检查那个前端。它后面的 Apache 实例可能从不向公开浏览器出示证书,因此改它的配置不会改变浏览器看到的任何东西。套接字视图与外部握手必须描述同一条路径,这正是这次对比要确立的。
先对齐虚拟主机,再动文件
当 Apache 是终结者时,问它对那个地址和名字哪个虚拟主机胜出。控制命令会打印实际布局,包括每个套接字匹配的组、声明的服务器名以及被视为默认的主机。在没有这个答案的情况下改证书文件,正是错误站点从正确文件里被提供的来路。
sudo apachectl -S
Apache 的 SSL 常见问题解释了服务器名称指示如何选择证书。HTTP 的 Host 头在握手之后才到达,无法追溯改变已经呈现的内容,因此不匹配或缺失的名字会回落到默认主机。
ServerAlias 里带拼写错误的具名虚拟主机恰好产生这个症状,先加载兜底主机的第二个配置文件也一样。两者都能在那个布局列表里看到。
在你声称的每条路径上验证修复
批准变更之后,对每个地址族重复按主机名进行的检查,并以浏览器的常规验证收尾,而不是绕过标志。在触碰共享的监听设置之前保留一条独立的管理路径,因为那里的失误会移除你用来回滚的访问。然后写下哪个监听者应答、哪个虚拟主机匹配,以及前后分别提供了哪张证书。
移除软件包可能改变布局,让原本的不匹配失去解释,所以那份记录比修复活得更久。
你要的是在预期入口得到预期的站点。无关服务消失后换了一张证书,即使浏览器不再报怨,也不是那个结果。