Nginx 通过 Let‘s Encrypt 实现 HTTPS 访问全流程指南
一、Let’s Encrypt 与 Certbot 简介
Let’s Encrypt 是由非营利组织 ISRG 运营的免费证书颁发机构(CA),旨在推动 HTTPS 的普及。其核心工具 Certbot 能自动化完成证书申请、部署与续期,大幅降低 HTTPS 的配置复杂度。通过 Certbot 与 Nginx 的集成,用户可在 5 分钟内完成全流程配置 。
二、环境准备
1. 系统要求
- 操作系统:支持 CentOS 7+、Ubuntu 18.04+ 等主流 Linux 发行版
- 已安装 Nginx 并配置至少一个虚拟主机
- 域名解析:需将域名(如
example.com
)的 A 记录指向服务器公网 IP - 防火墙放行:确保 80(HTTP) 和 443(HTTPS) 端口开放
2. 安装 Certbot 与依赖
# CentOS 7
sudo yum install epel-release -y
sudo yum install certbot python3-certbot-nginx -y# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
注:python3-certbot-nginx
插件使 Certbot 能直接修改 Nginx 配置
三、证书申请与自动配置
1. 单域名证书申请
sudo certbot --nginx -d example.com -d www.example.com
流程说明:
- 输入邮箱用于接收证书到期提醒
- 同意服务条款(输入
A
确认) - 选择是否将 HTTP 流量重定向至 HTTPS(推荐选
2
) - Certbot 自动验证域名所有权并更新 Nginx 配置
2. 泛域名证书申请
sudo certbot certonly --manual --preferred-challenges=dns -d *.example.com
操作要点:
- 需手动在 DNS 解析中添加
_acme-challenge
的 TXT 记录 - 验证成功后证书路径:
/etc/letsencrypt/live/example.com/
四、Nginx 手动配置 HTTPS
若需自定义配置,可手动修改 Nginx 虚拟主机文件(如 /etc/nginx/conf.d/example.conf
):
server {listen 443 ssl http2;server_name example.com www.example.com;# 证书路径ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;# 协议与加密套件ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';ssl_prefer_server_ciphers on;# 强制 HTTP 重定向if ($scheme != "https") {return 301 https://$host$request_uri;}# 其他配置(如静态资源路径、反向代理等)root /var/www/html;index index.html;
}
配置完成后执行 sudo nginx -t
验证语法,再 systemctl reload nginx
生效
五、证书自动续期
Let’s Encrypt 证书有效期为 90 天,需定期续期。通过 crontab 设置自动任务:
# 编辑定时任务
sudo crontab -e# 添加以下行(每天 3 点检查续期)
0 3 * * * /usr/bin/certbot renew --quiet
注:--quiet
参数抑制非错误输出,适合生产环境
六、高级配置优化
1. OCSP 装订(提升 SSL 握手速度)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 valid=300s;
2. 安全增强
- HSTS 头:强制浏览器使用 HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
- 禁用弱加密算法:
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
3. 性能优化
- 启用 HTTP/2:
listen 443 ssl http2;
- 会话复用:
ssl_session_cache shared:SSL:10m;
七、常见问题排查
1. 证书申请失败
- DNS 未生效:通过
dig example.com
验证解析 - Nginx 配置错误:确保
server_name
与域名一致,且 80 端口开放
2. HTTPS 无法访问
- 检查防火墙规则:
sudo firewall-cmd --list-ports
- 验证证书路径权限:确保 Nginx 用户有读取权限
3. 续期失败
- 手动测试:
sudo certbot renew --dry-run
- 检查日志:
tail -f /var/log/letsencrypt/letsencrypt.log
总结
通过 Let’s Encrypt 与 Nginx 的集成,开发者可快速实现 HTTPS 部署并享受以下优势:
- 零成本:免费证书节省企业开支
- 自动化:Certbot 简化申请与续期流程
- 安全性:支持 TLS 1.3 等最新协议
- 高性能:通过 OCSP 装订和 HTTP/2 提升访问速度
建议定期检查证书状态,并参考 Mozilla SSL Configuration Generator 获取最新安全配置模板。如需深度定制(如多域名负载均衡),可结合 Kubernetes 等容器编排工具实现 。