如何在 Nginx 中设置 SSL 证书:完整的分步指南
使用 SSL/TLS 证书保护您的网站已不再是可选项——它是建立用户信任、保护数据安全和提升搜索引擎排名的基本要求。自 2014 年起,Google 已明确将 HTTPS 作为排名信号,现代浏览器也会主动警告访问者当网站缺乏加密时。如果您正在使用 Nginx 作为 Web 服务器,本指南将带您了解使用 Certbot 和 Let’s Encrypt 安装、配置和自动化 SSL 证书管理所需的一切知识。
无论您是在管理 VPS 托管环境、独立服务器还是共享托管计划,正确配置 SSL 对任何生产网站来说都是不可或缺的。
什么是 SSL 证书,为什么 Nginx 需要它?
SSL(安全套接层)证书——如今更准确地称为 TLS(传输层安全)证书——在您的 Web 服务器与访问者浏览器之间建立加密连接。这种加密确保登录凭据、支付信息和个人详情等敏感数据不会被恶意第三方拦截。
对于 Nginx 而言,SSL 配置涉及:
- 证书文件:由证书颁发机构(CA)颁发的公共证书链
- 私钥:安全存储在服务器上的加密生成密钥
- 服务器块指令:将证书绑定到您域名的 Nginx 配置指令
没有 SSL,您的网站通过 HTTP 提供服务,这意味着所有流量以明文传输。正确配置 SSL 后,您的网站使用 HTTPS——加密、经过身份验证,并受到浏览器和搜索引擎的信任。
> 专业提示:如果您正在评估托管选项,AlexHost 为各类域名提供 SSL 证书,包括域名验证(DV)、组织验证(OV)和扩展验证(EV)证书。
开始之前的准备条件
在深入配置步骤之前,请确保满足以下条件:
- 运行中的 Nginx Web 服务器,基于 Linux 系统(推荐 Ubuntu 20.04/22.04 或 Debian)
- 服务器的 root 或 sudo 访问权限
- 已注册的域名,通过 DNS A 记录指向您服务器的 IP 地址——您可以通过域名注册注册一个
- 开放的防火墙端口:TCP 端口 80(HTTP)和 443(HTTPS)必须可访问
- 具有 sudo 权限的非 root 用户(服务器安全的最佳实践)
您可以通过以下命令验证 Nginx 是否正在运行:
sudo systemctl status nginx并使用以下命令确认您的域名解析正确:
dig yourdomain.com +short第 1 步:在服务器上安装 Certbot
Certbot 是 Let’s Encrypt 的官方开源客户端——一个免费、自动化且广受信任的证书颁发机构。它处理整个证书颁发流程,包括域名验证和 Nginx 配置更新。
更新软件包索引
始终从刷新软件包列表开始,以确保您安装的是最新可用版本:
sudo apt update && sudo apt upgrade -y安装 Certbot 和 Nginx 插件
python3-certbot-nginx 插件允许 Certbot 直接读取和修改您的 Nginx 配置文件,自动化大部分设置过程:
sudo apt install certbot python3-certbot-nginx -y验证安装
通过检查版本确认 Certbot 安装成功:
certbot --version您应该看到类似 certbot 2.x.x 的输出。
第 2 步:允许 HTTPS 流量通过防火墙
如果您使用 UFW(简单防火墙),在继续之前需要明确允许 HTTPS 流量:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
sudo ufw statusNginx Full 配置文件允许 HTTP(端口 80)和 HTTPS(端口 443)。删除独立的 HTTP 规则可确保配置 SSL 后,不会留下不必要的开放端口。
第 3 步:从 Let’s Encrypt 获取 SSL 证书
安装 Certbot 并配置防火墙后,您现在可以请求证书。--nginx 标志告诉 Certbot 使用 Nginx 插件,该插件自动处理 ACME 质询验证并更新您的服务器配置。
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com此过程中发生了什么?
- 域名所有权验证:Certbot 临时修改您的 Nginx 配置以提供质询文件,向 Let’s Encrypt 证明您控制该域名
- 证书颁发:Let’s Encrypt 颁发有效期为 90 天的签名证书
- 自动 Nginx 配置:Certbot 更新您的 Nginx 服务器块以使用新的证书文件
交互式提示
在此过程中,Certbot 将询问:
- 电子邮件地址,用于紧急续期和安全通知
- 同意服务条款
- 是否将 HTTP 重定向到 HTTPS——始终选择选项 2(重定向)以在全站强制执行 HTTPS
您的证书将存储在:
/etc/letsencrypt/live/yourdomain.com/关键文件为:
| 文件 | 用途 |
|---|---|
fullchain.pem | 您的证书 + 中间链 |
privkey.pem | 您的私钥(请保密) |
cert.pem | 仅您的域名证书 |
chain.pem | 仅中间证书 |
第 4 步:手动配置 Nginx 的 SSL(高级)
虽然 Certbot 自动化了大部分配置,但了解手动设置可让您完全控制 SSL 实现——这对于性能调优、安全加固和自定义部署至关重要。
打开 Nginx 服务器块配置
sudo nano /etc/nginx/sites-available/yourdomain.com如果您使用默认配置文件:
sudo nano /etc/nginx/sites-available/default完整的 SSL 服务器块配置
用以下加固示例替换或更新您的配置:
# Redirect all HTTP traffic to HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
# HTTPS server block
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# SSL Certificate Paths
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# Recommended SSL parameters
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Security Headers
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "no-referrer-when-downgrade";
# Document root and index
root /var/www/yourdomain.com/html;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}关键配置指令说明
ssl_protocols TLSv1.2 TLSv1.3:禁用较旧的易受攻击协议(SSLv3、TLS 1.0、TLS 1.1)ssl_ciphers:指定优先考虑前向保密的强密码套件ssl_stapling on:启用 OCSP 装订,减少 SSL 握手延迟Strict-Transport-Security:指示浏览器始终对您的域名使用 HTTPS(HSTS)http2:启用 HTTP/2 以提升 HTTPS 连接性能
第 5 步:测试您的 Nginx 配置
在重启 Nginx 之前,始终验证您的配置语法以捕获可能导致网站下线的错误:
sudo nginx -t成功的测试返回:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful如果遇到错误,请仔细查看输出——Nginx 将指出问题所在的文件和行号。
第 6 步:重启 Nginx 以应用更改
配置测试通过后,重新加载或重启 Nginx:
# Graceful reload (preferred for production — no downtime)
sudo systemctl reload nginx
# Full restart (use if reload doesn't apply all changes)
sudo systemctl restart nginx重启后验证 Nginx 是否正常运行:
sudo systemctl status nginx第 7 步:设置 SSL 证书自动续期
Let’s Encrypt 证书在 90 天后过期。这个较短的有效期是有意为之的——它限制了证书泄露造成的损害并鼓励自动化。Certbot 会自动安装 systemd 计时器(或 cron 任务)来处理续期,但您应该验证并测试它。
检查现有续期计时器
sudo systemctl status certbot.timer您应该看到计时器处于活动状态并计划每天运行两次。
测试续期流程
模拟续期而不实际修改任何证书:
sudo certbot renew --dry-run成功的输出将包括:
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/yourdomain.com/fullchain.pem (success)添加续期后钩子以重新加载 Nginx
除非您配置部署钩子,否则 Certbot 在续期证书后不会自动重新加载 Nginx。使用以下命令创建一个:
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh添加以下内容:
#!/bin/bash
systemctl reload nginx使其可执行:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh这确保 Nginx 在每次成功续期后立即加载新的证书文件。
第 8 步:验证您的 SSL 安装
完成设置后,使用以下方法验证您的 SSL 配置:
浏览器检查
在浏览器中导航到 https://yourdomain.com。您应该在地址栏中看到一个挂锁图标,表示连接安全。
在线 SSL 测试工具
使用这些免费工具审核您的 SSL 配置质量:
- SSL Labs(Qualys):
https://www.ssllabs.com/ssltest/——提供字母评级(目标为 A 或 A+) - Security Headers:
https://securityheaders.com/——审核您的 HTTP 安全标头 - HSTS Preload:
https://hstspreload.org/——检查 HSTS 预加载资格
命令行验证
# Check certificate details
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
# Check certificate expiry date
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -datesNginx 中常见 SSL 问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
ERR_SSL_PROTOCOL_ERROR | Nginx 未监听端口 443 | 检查 listen 443 ssl; 指令和防火墙规则 |
NET::ERR_CERT_AUTHORITY_INVALID | 使用 cert.pem 而非 fullchain.pem | 将 ssl_certificate 更新为使用 fullchain.pem |
| 证书未续期 | Certbot 计时器已禁用或端口 80 被阻止 | 运行 sudo certbot renew --dry-run 并检查日志 |
| 混合内容警告 | HTTPS 页面加载了 HTTP 资源 | 将所有内部链接和资源 URL 更新为 HTTPS |
SSL_ERROR_RX_RECORD_TOO_LONG | HTTP 流量访问了 HTTPS 端口 | 确保已配置从端口 80 到 443 的重定向 |
为 SSL 选择合适的托管环境
您的 SSL 实现的性能和可靠性在很大程度上取决于您的托管环境。以下是简要概述:
- VPS 托管:完整的 root 访问权限让您完全控制 Nginx 配置、SSL 参数和证书管理——非常适合本指南
- 独立服务器:为需要企业级 SSL 配置的高流量网站提供最大性能和隔离
- 共享虚拟主机:SSL 通常通过控制面板管理;Certbot 手动配置可能不可用
- 带 cPanel 的 VPS:通过图形界面简化 SSL 管理,同时保留 VPS 级别的控制
对于需要完全控制其 SSL 堆栈的开发人员和系统管理员,VPS 或独立服务器是推荐的选择。
结论
在 Nginx 中设置 SSL 是一个多步骤过程,但每个步骤都有其关键目的——从加密流量和验证域名所有权,到加固密码配置和自动化续期。通过遵循本指南,您已实现:
✅ 通过 Let’s Encrypt 和 Certbot 获得免费、受信任的 SSL 证书
✅ 采用现代 TLS 协议的加固 Nginx SSL 配置
✅ 所有流量的 HTTP 到 HTTPS 重定向
✅ 用于改善握手性能的 OCSP 装订
✅ 用于深度防御的 HSTS 和安全标头
✅ 带有 Nginx 重新加载钩子的自动化证书续期
正确配置的 SSL 证书不仅能保护您的用户——它还能建立信任、提升您的 SEO 排名,并且是任何专业 Web 存在的基本要求。如果您正在寻找可靠的基础设施来托管您的 SSL 安全 Nginx 服务器,请探索 AlexHost 的 VPS 托管计划,专为重视安全的开发人员和企业打造。
