以前我把 HTTPS 理解成地址栏旁边的一把小锁,配置完成就算结束。真正维护过个人网站之后才发现,证书只是开始,代理配置、自动续期和跳转策略同样重要。一次完整的 HTTPS 部署,应该让访问更安全,也让后续维护更可控。

先把流量路径画清楚

我的网站通常会经过这样一条链路:浏览器 → Nginx → 应用服务 → 数据库。Nginx 负责接收 443 端口的加密请求,再把请求转发到只监听本机的应用端口。这样做的好处是,应用不必直接暴露在公网,证书和安全响应头也可以集中管理。

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
}

配置代理时,我会特别检查 Host 和 X-Forwarded-Proto。这两个头如果缺失,应用可能误以为自己运行在 HTTP 下,导致回调地址错误、登录跳转异常,甚至出现循环重定向。

自动续期比手动换证书更可靠

证书有效期有限,最稳妥的方式是让续期任务自动运行,同时定期检查任务状态。部署完成后,可以用下面的命令观察响应头和证书信息:

curl -I https://example.com
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \\
  | openssl x509 -noout -dates -issuer

我不会一上来就启用特别严格的 HSTS。先确认 HTTP 到 HTTPS 的跳转、子域名和证书续期都稳定,再逐步收紧策略。安全配置应该是可验证、可回滚的改动,而不是复制一段配置后祈祷它一直正常。

部署之后还要做一次“反向检查”

浏览器能打开,只能说明主路径可用。我还会检查静态资源是否全部走 HTTPS、后台登录是否正常、评论和图片上传是否出现混合内容,并从另一条网络访问一次。最后把证书到期时间记进自己的维护清单。

这次复盘让我明白,HTTPS 的价值不只是加密传输,更是把网站的边界画清楚:哪些流量允许进入,哪些服务只留在本机,证书出了问题如何发现。对个人站点来说,这种清晰比“看起来安全”更重要。