给网站启用 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 已生效后直接关闭所需端口。

自动续期需要验证整条流程

  1. 定时任务运行:确认 Certbot 的 systemd timer 或其他调度机制已启用。
  2. 验证条件仍成立:域名仍指向正确入口,挑战端口与路径可访问。
  3. 续期后重新加载:Nginx 需要加载新的证书文件,通常通过部署钩子完成。
  4. 做续期演练:使用客户端的 dry-run 测试验证流程,同时留意演练是否会跳过部署钩子。

HTTP 跳转应保留原始路径与查询参数,例如文章链接不能在跳转后都变成首页。启用 HSTS 等浏览器长期策略前,也应先确认站点和涉及的子域名确实能够持续提供 HTTPS。

参考资料

本文根据以下资料整理撰写,详细规范与版本行为请以原文为准。