Nginx部署SSL证书
约 708 字大约 2 分钟
2026-08-29
给网站配置 HTTPS 需要一张 SSL 证书并让 Nginx 加载。本文提供两种方式:使用 Let's Encrypt 免费证书(certbot 自动申请与续期,推荐),或手动部署已有证书文件。
前提
- 域名已解析到实例公网 IP,且 80 端口可访问(certbot 通过 80 端口完成验证)。
- 安全组已放行 TCP 80、443。
- Nginx 已安装,站点可正常 HTTP 访问(参见部署LNMP环境或Nginx服务配置多站点)。
方式一:Let's Encrypt 证书(certbot,推荐)
Let's Encrypt 提供免费证书,有效期 90 天,certbot 会自动续期,无需人工干预。
安装 certbot
Debian / Ubuntu
sudo apt install certbot python3-certbot-nginx -yCentOS 8+ / Rocky Linux
sudo dnf install certbot python3-certbot-nginx -y申请并自动配置
sudo certbot --nginx -d a.com -d www.a.comcertbot 会:
- 校验域名归属(向 80 端口写入验证文件)。
- 自动申请证书并改写您的 Nginx 配置,追加 443 的 server 块。
- 询问是否把 HTTP 重定向到 HTTPS,选择重定向。
完成后浏览器访问 https://a.com,地址栏出现锁标志即成功。
验证自动续期
sudo certbot renew --dry-run无报错即可,certbot 安装时已带系统定时任务,证书到期前会自动续期。
方式二:手动部署已有证书
已从证书服务商购买/下载了证书文件的(通常是 .pem/.crt 证书链 + .key 私钥):
上传证书到实例,如
/etc/nginx/certs/:sudo mkdir -p /etc/nginx/certs sudo scp a.com.pem a.com.key root@<实例IP>:/etc/nginx/certs/在站点配置中增加 443 的 server 块:
server { listen 443 ssl; server_name www.a.com a.com; root /var/www/sitea; index index.html index.php; ssl_certificate /etc/nginx/certs/a.com.pem; ssl_certificate_key /etc/nginx/certs/a.com.key; ssl_protocols TLSv1.2 TLSv1.3; } # HTTP 301 跳转到 HTTPS server { listen 80; server_name www.a.com a.com; return 301 https://$host$request_uri; }检查并重载:
sudo nginx -t && sudo systemctl reload nginx
私钥安全
.key 私钥文件权限设为 600,不要提交到代码仓库或放在网站目录下,否则证书等同于泄露。
常见问题
申请时报 "Failed authorization procedure"?
certbot 无法通过 80 端口验证域名,逐项检查:域名解析是否已生效(ping 域名 应返回实例 IP)、安全组是否放行 80、Nginx 是否在运行。
浏览器仍提示"不安全"?
- 证书域名与访问的域名不一致(如证书是
a.com却访问b.com)。 - 页面内引用了 http:// 的图片/脚本(混合内容),改为 https:// 引用。
证书续期失败?
多为续期时 80 端口被占用或域名解析变更:sudo certbot renew --dry-run 查看具体报错,对应修复即可。
一台服务器多个站点都要 HTTPS?
每个站点分别执行一次 certbot --nginx -d 域名 即可,certbot 按域名分别管理证书。
