给网站启用 HTTPS,需要把域名、端口、证书与 Web 服务连起来。仅有证书文件并不会让浏览器自动建立安全连接;服务器要监听对应端口,云端网络规则也要允许访问。
浏览器连接网站时发生了什么
以常见的 HTTP/1.1 或 HTTP/2 网站为例,客户端先通过 DNS 获得地址,再建立 TCP 连接,随后完成 TLS 握手,最后发送 HTTP 请求。HTTP/3 使用基于 UDP 的 QUIC,传输层路径有所不同,不能直接照搬 TCP 的诊断方法。
TLS 握手过程中,服务器提供证书,客户端检查域名匹配、有效期和信任链,并与服务器协商保护后续通信的密钥。证书主要帮助客户端验证连接的服务器身份,TLS 同时提供传输中的机密性与完整性保护。
超时、证书错误与 404 要分开看
| 现象 | 优先检查 |
|---|---|
| 名称解析失败 | 域名记录、委派、解析器及缓存。 |
| 连接超时 | 网络路径、云安全组或防火墙、服务器状态。 |
| 连接被拒绝 | 目标端口是否监听,是否有规则主动拒绝连接。 |
| 证书验证失败 | 域名、有效期、证书链和客户端时间。 |
| HTTP 404 / 502 | 前者检查文件与路由;后者检查代理上游。 |
可以先分别观察两个协议的响应,再检查服务器配置。以下为 Linux 上的示例;curl -I 发送的是 HEAD 请求,若站点不支持 HEAD,应改用 GET 复核。
curl -I http://example.com/
curl -I https://example.com/
sudo nginx -t
sudo ss -lntp
测试证书时应保留默认校验。curl -k 会跳过证书验证,只适合明确需要隔离某类问题的诊断,不能用它的成功结果证明正常访客访问已经安全可用。
HTTP-01 验证为什么需要 80 端口
Let’s Encrypt 的 HTTP-01 验证通过访问 http://域名/.well-known/acme-challenge/验证文件,确认申请者控制这个域名。该验证从 80 端口开始,可能由多个位置进行。日常页面使用 HTTPS,并不会取消这种验证方式对 80 端口的要求。
部署时可以让普通 HTTP 请求跳转到 HTTPS,同时为挑战路径保留文件访问。若使用 Webroot 验证器,客户端写入验证文件的目录必须与 Nginx 对该路径使用的目录一致。多台服务器或 CDN 场景还要确认所有可能接到验证请求的节点都能提供正确文件。
DNS-01 则通过指定 TXT 记录验证,适合通配符证书等场景,但自动化续期通常需要能自动更新 DNS 记录的客户端和相应权限。应根据实际部署选用验证方式,而不是在 HTTP-01 已生效后直接关闭所需端口。
自动续期需要验证整条流程
- 定时任务运行:确认 Certbot 的 systemd timer 或其他调度机制已启用。
- 验证条件仍成立:域名仍指向正确入口,挑战端口与路径可访问。
- 续期后重新加载:Nginx 需要加载新的证书文件,通常通过部署钩子完成。
- 做续期演练:使用客户端的 dry-run 测试验证流程,同时留意演练是否会跳过部署钩子。
HTTP 跳转应保留原始路径与查询参数,例如文章链接不能在跳转后都变成首页。启用 HSTS 等浏览器长期策略前,也应先确认站点和涉及的子域名确实能够持续提供 HTTPS。
参考资料
本文根据以下资料整理撰写,详细规范与版本行为请以原文为准。