
网站从 HTTP 切到 HTTPS 不只是装张证书:选型、Nginx 配置、强制跳转、自动续期四步缺一不可。最容易踩坑的是最后一步——上线三个月后 HTTPS 证书到期没人续,浏览器标红拦截,流量断崖下跌。
一、部署前的两项准备
1. 证书类型怎么选
DV 证书只校验域名所有权,几分钟即可签发;OV 与 EV 证书需要企业实名材料,价值在地址栏展示组织名称,对搜索排名并无额外权重。免费证书主流是 Let's Encrypt,单张 90 天有效期,靠脚本自动续期维持长期可用。
2. 域名与端口前提
ACME 签发时默认用 HTTP-01 校验,要求域名已解析到目标服务器,且 80 端口能被公网访问——CA 会回访 http://域名/.well-known/acme-challenge/ 下的校验文件。若站点在 CDN 或反向代理之后,必须确保该路径能穿透到源站,否则改用 DNS-01,在解析处加 TXT 记录完成验证。
二、Nginx 上的证书部署
1. 用 acme.sh 申请证书
acme.sh 是纯 Shell 实现,无需 Python 依赖,装在 /root/.acme.sh 目录下:
~/.acme.sh/acme.sh --issue -d www.codewithtu.cn --webroot /www/wwwroot/site
签发后证书放在 ~/.acme.sh/域名/ 目录,但不要直接引用该路径——续期会重新生成文件。正确做法是用 --install-cert 复制到固定目录并重载 Nginx。
2. 443 端口配置与强制跳转
server { listen 443 ssl;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; }
server { listen 80;
return 301 https://$host$request_uri; }
fullchain.pem 必须包含域名证书与中间证书,只配域名证书会让部分安卓设备报「证书链不完整」。TLSv1.0 与 1.1 已不满足支付行业合规要求,直接关掉。80 端口只做跳转不承载业务,且用 301 而非 302,搜索引擎才能把权重从 HTTP 传递到 HTTPS。
三、自动续期与故障排查
1. 续期依赖定时任务
acme.sh 安装时自动写入 crontab,每天检查一次,剩余不足 30 天时自动续期,用 acme.sh --list 可查看各证书到期时间。关键在于 --install-cert 时加上 --reloadcmd "nginx -s reload",否则续期成功文件更新了,Nginx 仍在用旧证书。
2. 续期失败的常见原因
- 80 端口被占用或被防火墙拦截,HTTP-01 校验无法完成
- webroot 路径写错,校验文件没落到站点根目录
- Nginx 把
/.well-known/路径重写到首页,校验请求返回 404
排查时手动执行 acme.sh --issue --debug,日志会打印 CA 返回的原始错误。
3. 上线后的注意事项
- 用
openssl s_client -connect 域名:443 -servername 域名 </dev/null检查证书链与到期时间。 - 证书剩余天数接入监控告警,别只依赖续期脚本静默运行。
关键配置提示
- 证书路径统一放
/etc/nginx/ssl/,不要让 Nginx 直接引用.acme.sh目录。 --reloadcmd必配,否则续期成功也不会生效。- 开启 HSTS 前先确认全站无 HTTP 资源,避免不可回退。

快来评论,快来抢沙发吧~