HTTPS 反向代理到底保护了什么:从 SNI、证书到 X-Forwarded-Proto
把浏览器到应用的每一跳讲清楚,避免“有小绿锁但链路仍混乱”。
反向代理像大楼前台:访客只看到一个入口,但前台必须知道把谁送到哪一层,还不能把访客身份写错。
给服务套上 HTTPS 后,浏览器出现小锁,并不代表整条链路自动正确。域名先经过 DNS 找到服务器,TLS 通过 SNI 选择证书,反向代理再根据 Host 把请求送到后端。后端通常仍是 HTTP,但只能在本机或私有网络访问。任何一环的地址、协议或头部不一致,都可能造成循环跳转、错误链接、认证 Cookie 不安全或直接绕过代理。
理解链路比记配置片段更重要。配置片段会随 Nginx、Caddy、Lucky 或云负载均衡器变化,而“谁终止 TLS、谁保留原始主机、谁告诉应用外部协议”这三个问题不会变。
SNI 是 TLS 握手阶段的门牌号
同一 IP 的 443 端口可以服务多个域名,是因为客户端在握手时通过 SNI 告诉服务器想访问哪个名字。代理据此选择匹配证书。泛域名证书 *.example.com 通常覆盖一个层级的子域名,却不覆盖更深层级,也不自动覆盖裸域。证书覆盖范围应通过实际握手验证,不要只看证书管理页面显示“已启用”。
自动续签也不是“配置过一次就永久安全”。DNS API 权限可能失效,域名托管商会调整接口,时间同步或网络问题也会让挑战失败。应该监控到期时间和续签日志,并在到期前主动验证新证书已经由线上端口提供。
TLS 在代理结束,后端如何知道外面是 HTTPS
代理把 HTTPS 解密后,常用 HTTP 请求本机后端。此时后端看到的连接协议是 HTTP,如果没有 X-Forwarded-Proto: https,它可能把访问者重定向到自己认为正确的 HTTPS 地址,代理再转成 HTTP,最终形成循环。Ghost 官方文档特别提醒,外部使用 HTTPS 时必须正确传递这个头。
同样要保留 Host、客户端 IP 和转发链。X-Forwarded-For 只能信任来自已知代理的值,否则客户端可以自己伪造。应用应配置可信代理范围,而不是无条件把任意请求头当成真实身份。
关闭旁门比装修正门更重要
如果应用同时把原始端口暴露给公网,攻击者可以绕过代理上的 TLS、Basic Auth、WAF、限速和访问日志,直接敲后端的门。代理验证完成后,优先把后端端口绑定为 127.0.0.1,或只允许代理网络访问。保留公网直连仅适合有明确故障切换需求且同样具备认证的场景。
Docker Compose 中的 127.0.0.1:2368:2368 与 2368:2368 含义不同:前者只在宿主机回环监听,后者通常在所有地址监听。用 ss 和外部请求同时验证,不能只看 Compose 文字。
80、443 与 DNS 验证
HTTP-01 证书验证通常需要 80 端口,而 DNS-01 通过 DNS TXT 记录证明域名控制权,不依赖 Web 服务端口,也适合泛域名证书。已经有其他服务占用 80 时,DNS 验证往往更干净。但 DNS API Token 权限较大,应限制到必要域名或区域,并避免与应用运行凭据混在一起。
是否保留 HTTP 到 HTTPS 跳转取决于入口架构。如果 80 被另一个代理占用,就不要让两个服务争抢端口。可以只发布 HTTPS 地址,或由真正持有 80 的入口统一跳转。端口所有权应清晰,而不是靠启动顺序碰运气。
一次完整的上线验证
验证至少包括:DNS 从公共解析器返回正确 IP;TLS 证书 SAN 覆盖域名且链可信;首页和管理页返回预期状态;HTML 中 canonical、图片和 API 地址使用新域名;大文件上传和 WebSocket 如有需要能正常工作;后端日志记录真实协议与来源。
最后从手机流量或独立网络测试,避免本机 DNS 缓存、代理软件或 hosts 文件制造假成功。证据应保留为命令输出和时间戳,这样证书续签或代理调整后可以重新跑同一套检查。
可以直接照着做的检查清单
- 确认 DNS、SNI、证书 SAN 和监听端口属于同一条链路。
- 传递 Host、X-Forwarded-Proto 和受控的客户端 IP 头。
- 代理验证完成后,将后端端口限制到回环或内部网络。
- 监控证书到期时间与续签失败,而不是只依赖自动任务。
- 从外部网络验证首页、管理页、资源链接和必要长连接。
- 记录 80 与 443 的唯一所有者,避免多个代理竞争端口。
延伸阅读
- Ghost Configuration and Reverse Proxy Guidance
- Let's Encrypt Challenge Types
- Lucky Web Service Documentation
- Lucky SSL Certificate Documentation
HTTPS 的价值不只是加密一段连接,而是建立一条身份、协议和路由都不含糊的信任链。