
HTTPS 刚部署好的时候一切正常,几个月后访客却开始看到“不安全”的提示。可能是证书到期,自动续期没有执行;可能是续期成功了,Nginx 还在用旧证书;也可能证书只覆盖了主域名,访问 www 子域名就报错。
完整的国外云服务器 HTTPS 配置,至少包含四个环节:域名解析与验证、证书申请、Nginx 配置,以及续期任务验证。本文沿着“初次签发、Nginx 配置、自动续期、故障验证”这条完整的操作链往下讲。
检查域名的 A 记录、AAAA 记录和可能存在的 CNAME,确认指向的是实际提供服务的服务器或前置代理。DNS 还指向旧服务器,或者 AAAA 记录指向了一个访问不通的 IPv6 地址,证书验证和网站访问都可能失败。
按所用的验证方式,核对服务器监听端口、主机防火墙和云平台的网络规则。HTTP-01 验证通常要求验证端点能通过 HTTP 访问;用 DNS-01 的话,则按对应的 DNS 验证流程配置。不同验证方式对网络条件的要求并不一样,别套用同一套。
申请前先列出主域名、www 子域名,以及需要独立提供 HTTPS 的业务子域名。证书的域名范围要在申请时说清楚,别等上线后才发现某个子域名没被覆盖。
常见做法是用 ACME 协议自动化签发,Certbot 是其中常用的工具。两种常见的验证方式:
HTTP-01 验证:适用于域名能通过 HTTP 完成验证的场景
DNS-01 验证:按指定规则设置 DNS 验证记录,适用于相应的 DNS 验证和通配符证书场景
具体操作取决于系统发行版、软件包来源、Nginx 的安装方式和证书管理工具,没有哪一套命令适用于所有系统。
先确认实际使用的站点配置文件和证书路径,看看 Nginx 里有没有多个虚拟主机、反向代理或已有的 HTTPS 规则。不要直接覆盖生产配置,先备份、记录当前有效的版本,免得编辑出错导致网站中断。
Nginx 要指向正确的证书文件和私钥文件,并把对应域名绑定到正确的 HTTPS 虚拟主机。网站同时服务主域名和 www 的话,核对 server_name 与证书覆盖范围是否一致。
先确认 HTTPS 页面、关键业务请求、图片资源和反向代理接口都正常,再设置 HTTP 自动跳转。网站如果启用了 CDN、反向代理或其他前置网关,还要检查前后端对协议的识别是否正确,否则可能出现循环跳转或后台登录异常。
证书工具通常会配合系统计时器或定时任务来做续期检查,具体机制取决于安装来源和配置方式。要核实系统里实际启用的是哪一种,别同时配置多套续期任务,也别以为装完证书就一定开启了自动续期。近年来公共证书的有效期在逐步缩短,续期是否真的在跑,比以前更要紧。
这是整套流程里最容易漏掉的一环:续期工具可能已经生成了新证书,运行中的 Nginx 却仍然在使用旧证书。需要按证书工具推荐的方式配置部署钩子,在续期成功后先执行配置检查,再让服务重新加载证书。有的验证方式下工具会自动重载 Nginx,有的不会,不能想当然。
建议依次做这几件事:
1. 查看证书管理工具的当前状态
2. 检查续期任务是否存在并正常执行
3. 按工具官方文档提供的测试模式做一次续期演练
4. 检查 Nginx 配置测试是否通过
5. 从外部验证实际对外提供的证书及有效期
以 Certbot 为例,演练、配置检查和外部验证可以这样做:
certbot renew --dry-run
nginx -t
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
前提是环境确实在用 Certbot,其他证书管理工具有各自的命令,不能直接套用。最后一条里的 example.com 要换成自己的域名,看到的就是外部实际拿到的证书有效期。
下面按“症状、检查位置、修复方向”来整理。
检查续期任务、工具的运行日志、域名控制权验证,以及证书管理的权限。
检查 Nginx 实际加载的证书路径、服务重载情况、是否存在多个虚拟主机,以及 CDN 或负载均衡是否还在提供旧证书。
检查证书的域名覆盖范围、DNS 指向,以及对应的 Nginx 虚拟主机配置。
检查 HTTP/HTTPS 跳转、反向代理传递的协议头、WordPress 等应用里设置的站点地址,以及页面引用的 HTTP 资源。混合内容通常是页面资源仍通过 HTTP 加载造成的,重新申请证书未必能解决。
域名解析正确,验证方式满足要求
HTTPS 虚拟主机与证书域名匹配
Nginx 配置测试通过
证书续期任务已启用
续期后能自动或按设计重新加载证书
有证书到期监控和失败告警
变更前保留配置备份及回滚方式
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。