网站 HTTPS 证书申请与 Nginx 自动续期部署实战

5 ℃ 0 条
内容摘要网站从 HTTP 迁移到 HTTPS 不只是装张证书:选型、Nginx 监听配置、强制跳转、自动续期四步缺一不可。最容易踩坑的是最后一步,证书到期无人续会让浏览器标红拦截。本文按实操顺序走完这四步,并给出一套可复用的自动续期与故障排查方案。
网站 HTTPS 证书申请与 Nginx 自动续期部署实战

HTTPS 证书部署与 Nginx 自动续期

网站从 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. 上线后的注意事项

  1. 用 openssl s_client -connect 域名:443 -servername 域名 </dev/null 检查证书链与到期时间。
  2. 证书剩余天数接入监控告警,别只依赖续期脚本静默运行。

关键配置提示

  • 证书路径统一放 /etc/nginx/ssl/,不要让 Nginx 直接引用 .acme.sh 目录。
  • --reloadcmd 必配,否则续期成功也不会生效。
  • 开启 HSTS 前先确认全站无 HTTP 资源,避免不可回退。

上一篇:Apache虚拟主机搭建多个站点功能实现

下一篇:没有了

发表评论 (已有0条评论)

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