前几天我在处理公司网站时遇到了一个问题:同一个网站,我的电脑和手机都能打开,另一台电脑却打不开,而且三台设备连的还是同一个 Wi-Fi。
我一开始觉得,既然大家连的是同一个 Wi-Fi,那访问结果应该也是一样的。后来继续检查才发现,我把“网络相同”和“访问过程相同”当成了一回事。实际上,每台设备的 DNS、浏览器缓存、代理、HTTPS 设置和安全软件都可能不一样。
这次问题最后还牵扯出了 HTTP、HTTPS、80 和 443 端口,以及安全证书。以前我知道 HTTPS 更安全,但并没有真正理解它们是怎么连在一起的。
先说这次网站为什么有的设备能打开
当时的网站可以通过 HTTP 访问,但是 HTTPS 没有正确配置。能打开网站的设备访问的是 http://www.lszyfwh.com,另一台电脑可能因为浏览器设置、以前留下的跳转记录,或者 HSTS,自动尝试访问了 https://www.lszyfwh.com。
这两个地址看起来只是多了一个字母,但实际连接的入口并不一样:
- HTTP 通常使用 80 端口。
- HTTPS 通常使用 443 端口。
如果服务器只开了 80 端口,那么 HTTP 可以访问,不代表 HTTPS 也可以访问。浏览器连接 443 端口时,可能会直接显示连接被拒绝。
这也是我这次学到的第一个判断方法:不要只说网站“能打开”或者“打不开”,而要先看访问的是 HTTP 还是 HTTPS,以及浏览器显示的具体错误。
HTTP 是什么
HTTP 是浏览器和服务器之间交换信息的一套规则。浏览器向服务器发送请求,服务器处理以后再返回响应。
比如我们打开一个文章页面时,浏览器会告诉服务器自己想访问哪个地址。服务器找到对应内容以后,会返回状态码、网页内容和其他信息。
HTTP 负责的是双方怎样交流,但普通 HTTP 本身没有保护通信内容。如果数据在传输过程中被别人截获,对方可能看到里面的内容,也可能对内容进行修改。
所以像密码、Cookie、登录状态和表单数据,都不适合直接通过普通 HTTP 传输。
HTTPS 和 HTTP 到底是什么关系
以前我会把 HTTP 和 HTTPS 当成两套不同的东西。后来才理解,HTTPS 并不是把 HTTP 完全换掉,而是先通过 TLS 建立一条安全连接,再在这条连接里传输 HTTP 请求和响应。
一个比较简单的访问过程是:
- 浏览器连接服务器的 443 端口。
- 浏览器和服务器进行 TLS 握手。
- 浏览器检查服务器提供的安全证书。
- 双方协商后续通信使用的密钥。
- 安全连接建立完成,再开始传输 HTTP 数据。
TLS 主要保护三件事:
- 机密性:让其他人即使截获数据,也很难直接读懂内容。
- 完整性:如果传输内容被修改,通信双方可以发现。
- 身份验证:确认当前连接的服务器确实有权代表这个域名。
我之前还有一个理解不准确的地方,以为安全证书本身就是用来加密整个网页的。实际上,大量网页数据一般由 TLS 握手时协商出来的会话密钥进行加密。证书更重要的作用,是证明域名身份,并把域名和公钥联系起来。
HTTPS 安全证书是什么
大家平时常说的“SSL 证书”,现在更准确地说应该是 TLS 证书。证书中通常会记录域名、公钥、颁发机构、有效期和签名等信息。
浏览器访问 HTTPS 网站时,会检查下面这些内容:
- 证书中的域名和当前访问的域名是否一致。
- 证书是否还在有效期内。
- 证书是不是由浏览器或系统信任的机构签发。
- 中间证书是否完整,能不能一直验证到受信任的根证书。
- 服务器是否持有与证书公钥对应的私钥。
不过,浏览器显示连接安全,只能说明当前连接经过了加密,并且证书验证通过,不代表这个网站上的所有内容都一定可信。钓鱼网站也可以给自己的域名申请正常证书,所以访问网站时还是要看清楚域名。
我当时还把两种“证书”弄混了
公司网站的服务商后台里有一个“域名证书”入口。我当时看到这个名字,就以为它是 HTTPS 使用的安全证书。
点进去以后才发现,它其实只是域名注册证明,上面记录的是域名注册单位、注册时间和到期时间。它可以证明域名登记信息,但不能用来启用 HTTPS。
真正的 HTTPS 证书需要部署到 Web 服务器上,并且和域名、私钥以及 443 端口绑定。只在后台下载一份证书文件,并不会让网站自动支持 HTTPS。
这两种证书的区别可以简单记成:
- 域名注册证明:说明这个域名登记给了谁。
- TLS 安全证书:在访问网站时证明服务器身份,并参与建立安全连接。
网站要怎样支持 HTTPS
把整个过程整理以后,我现在理解的 HTTPS 配置步骤大概是:
- 准备好域名和能够运行网站的服务器。
- 向证书颁发机构申请证书。
- 通过 DNS 记录或指定的 HTTP 文件,证明自己可以控制这个域名。
- 生成私钥和 CSR,并提交证书申请。
- 取得网站证书和中间证书链。
- 在 IIS、Nginx、Apache 或托管平台中安装证书。
- 为正确的域名绑定 443 端口和证书。
- 确认 HTTPS 可以正常访问后,再把 HTTP 跳转到 HTTPS。
这里比较容易忽略的是私钥。证书里的公钥可以公开,但私钥必须保存在服务器上,不能随便发送,也不能上传到公开代码仓库。如果只有证书文件却没有对应的私钥,服务器也无法正确完成身份验证。
为什么同一个 Wi-Fi 还是会出现不同结果
这次问题让我重新理解了设备访问网站的过程。设备连接 Wi-Fi 只是第一步,后面还要经过浏览器、本机缓存、DNS、代理、服务器端口、TLS 和网站程序。
即使使用同一个 Wi-Fi,不同设备之间也可能存在这些差别:
- 使用了不同的 DNS 或安全 DNS。
- 浏览器保存了不同的缓存和跳转记录。
- 某台设备开启了“始终使用 HTTPS”。
- 某台电脑使用了代理或 VPN。
- 安全软件拦截了连接。
- 系统时间不正确,导致证书有效期检查失败。
- 浏览器曾经记录过这个域名的 HSTS 设置。
HSTS 的作用是告诉浏览器,以后访问这个域名时只能使用 HTTPS。它可以防止连接从 HTTPS 降级到不安全的 HTTP,但如果服务器后来没有正确配置 HTTPS,某些保存过 HSTS 记录的设备就可能打不开网站,而没有这条记录的设备还可以通过 HTTP 访问。
以后再遇到类似问题,我会怎么检查
以前遇到“网站打不开”,我一般会先刷新网页,或者怀疑是不是网络不好。现在我觉得更有效的方法是按顺序确定问题发生在哪一层。
- 记录完整错误信息。先看是域名解析失败、连接超时、连接被拒绝,还是证书错误。
- 分别测试 HTTP 和 HTTPS。手动输入完整地址,并观察浏览器有没有自动把 HTTP 改成 HTTPS。
- 检查 DNS。使用
nslookup 域名,对比不同设备解析出来的 IP 地址。
- 检查端口。HTTP 主要看 80,HTTPS 主要看 443。
- 检查本机设置。用无痕窗口测试,再检查代理、VPN、安全软件、浏览器设置和系统时间。
- 检查服务器和证书。确认域名绑定、证书有效期、证书链、私钥和 HTTPS 端口配置。
根据错误现象,也可以先做一个大概判断:
- HTTP 能开,HTTPS 显示连接被拒绝:可能是 443 端口或 HTTPS 服务没有启用。
- HTTP 能开,HTTPS 显示证书警告:说明 443 已经有响应,但证书配置存在问题。
- HTTP 自动跳到 HTTPS 后失败:需要先修复 HTTPS,同时检查浏览器缓存和 HSTS。
- 只有一台设备打不开:优先检查这台设备本身的 DNS、代理、缓存和浏览器设置。
- 所有设备都打不开:优先检查域名解析、服务器状态、防火墙和端口。
这次学习以后,我真正理解了什么
以前我知道域名要解析到服务器,也知道 HTTPS 需要证书,但这些知识点在我脑子里是分开的。真正遇到网站故障以后,我才把它们连成了一条完整的访问过程。
域名负责让人找到地址,DNS 负责把域名解析成 IP,端口负责找到服务器上的具体服务,HTTP 规定浏览器和服务器怎样交流,TLS 负责保护通信,安全证书则帮助浏览器确认服务器身份。
这次排查对我来说比较有价值的地方,不只是解决了某一台电脑打不开的问题,而是让我知道以后面对网络问题时,应该先分清楚每一层分别负责什么,再根据错误逐层排除,而不是把 DNS、服务器、HTTPS 和证书混在一起猜。