好的,Nginx 配置 HTTPS 证书是实现网站安全访问的基础。下面我将为您提供一个从证书获取到 Nginx 配置的完整、详细的实现指南,涵盖两种主流场景:使用 Let‘s Encrypt 免费证书和使用商业证书。
![图片[1]_Nginx 配置 HTTPS 证书_知途无界](https://zhituwujie.com/wp-content/uploads/2025/12/d2b5ca33bd20251211095341.png)
核心概念
- SSL/TLS 证书:一种数字证书,用于在客户端(如浏览器)和服务器之间建立加密链接,并验证服务器的身份。
- HTTPS:在 HTTP 协议基础上加入 SSL/TLS 加密层。
- 证书链:通常包括服务器证书、中间证书颁发机构(Intermediate CA)证书和根证书。浏览器需要完整的证书链来验证服务器证书的有效性。
- 私钥:与证书配对的密钥,必须严格保密,用于解密客户端发送的加密信息。
前提条件
- 一台拥有公网 IP 的服务器(如阿里云、腾讯云 ECS)。
- 一个已解析到该服务器 IP 的域名(如
example.com)。 - 已安装 Nginx。如果未安装,请先安装:
# Ubuntu/Debian sudo apt update && sudo apt install nginx -y # CentOS/RHEL sudo yum install epel-release -y sudo yum install nginx -y
方案一:使用 Let’s Encrypt (certbot) 自动配置(推荐用于个人或小型网站)
Let’s Encrypt 提供免费的、自动化的 SSL 证书,有效期为 90 天,但通过 certbot 工具可以轻松实现自动续期。
步骤 1:安装 Certbot
# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y
# CentOS/RHEL (需要先启用 EPEL 和 PowerTools)
sudo yum install epel-release -y
sudo yum config-manager --set-enabled powertools # CentOS 8/RHEL 8
# 或者 sudo dnf config-manager --set-enabled crb # CentOS 9/RHEL 9
sudo yum install certbot python3-certbot-nginx -y
步骤 2:获取证书并自动配置 Nginx
certbot 的 --nginx 插件可以自动修改你的 Nginx 配置文件,添加 SSL 相关设置。
sudo certbot --nginx -d example.com -d www.example.com
-d:指定要为其申请证书的域名。你可以一次性添加多个。
执行过程交互:
- 输入邮箱地址(用于紧急续期和安全通知)。
- 阅读并同意服务条款。
- 选择是否将 HTTP 流量重定向到 HTTPS(
Redirect)。强烈建议选择 ‘2’ 以强制使用 HTTPS。
完成后,Certbot 会自动重启 Nginx,你的网站就已经可以通过 HTTPS 访问了。
步骤 3:验证自动续期
证书每 90 天需要续期。Certbot 在安装时会自动创建一个定时任务(cron job 或 systemd timer)来尝试续期。
你可以手动测试续期过程:
sudo certbot renew --dry-run
如果这个命令没有报错,说明自动续期配置成功。
方案二:使用商业证书或手动上传证书
这种方式适用于从其他 CA 机构(如 DigiCert, GeoTrust, TrustAsia 等)购买的证书。
步骤 1:获取证书文件
购买证书后,你会从 CA 那里收到一个或多个文件,通常包括:
- YourDomain.crt:你的域名证书文件。
- YourDomain.key:你的私钥文件(如果你是自己生成的 CSR,则已有此文件)。
- intermediate.crt 或 ca-bundle.crt:中间证书链文件。
步骤 2:在服务器上组织证书文件
将收到的文件上传到服务器上一个安全的目录,例如 /etc/nginx/ssl/。
sudo mkdir -p /etc/nginx/ssl/example.com
# 使用 scp 或其他工具上传 YourDomain.crt, YourDomain.key, intermediate.crt 到该目录
非常重要: 合并证书链。
Nginx 要求一个完整的证书链文件(full chain)。你需要将你的域名证书和中间证书合并成一个文件。
# 进入证书目录
cd /etc/nginx/ssl/example.com
# 合并证书:你的证书在前,中间证书在后
cat YourDomain.crt intermediate.crt > fullchain.pem
# 你的私钥文件应该是 YourDomain.key
# 为了方便,可以创建一个符号链接或直接重命名
ln -s YourDomain.key privkey.pem
# 或者直接重命名
mv YourDomain.key privkey.pem
现在你有两个关键文件:
fullchain.pem:包含服务器证书和中间证书链。privkey.pem:包含你的私钥。
设置正确的文件权限(安全关键!):
私钥必须是只读且仅对所有者(通常是 root 或 nginx 用户)可见。
sudo chmod 600 /etc/nginx/ssl/example.com/privkey.pem
sudo chmod 644 /etc/nginx/ssl/example.com/fullchain.pem
sudo chown -R root:root /etc/nginx/ssl/example.com/
步骤 3:配置 Nginx
编辑你的 Nginx 站点配置文件,通常在 /etc/nginx/sites-available/example.com 或 /etc/nginx/conf.d/example.com.conf。
# HTTP 服务器块,用于将 HTTP 请求重定向到 HTTPS
server {
listen 80;
server_name example.com www.example.com;
# 如果你的证书支持,可以让 Let's Encrypt 验证域名的目录,否则注释掉下一行
# location /.well-known/acme-challenge/ { ... }
# 强制将所有 HTTP 请求重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS 服务器块
server {
listen 443 ssl http2; # 启用 HTTP/2 提升性能
server_name example.com www.example.com;
# === SSL 证书配置 ===
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem; # 合并后的证书链路径
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem; # 私钥路径
# === SSL 协议与加密套件优化 ===
ssl_protocols TLSv1.2 TLSv1.3; # 只使用安全的协议版本
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off; # 对于 TLSv1.3,建议设置为 off
# === 安全增强头部 ===
add_header Strict-Transport-Security "max-age=63072000" always; # 强制浏览器使用 HTTPS
add_header X-Frame-Options DENY; # 防止点击劫持
add_header X-Content-Type-Options nosniff; # 防止 MIME 类型嗅探攻击
# === 其他常规配置 ===
root /var/www/html; # 你的网站根目录
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 可以配置 gzip, proxy_pass 等其他设置
}
步骤 4:测试并重载 Nginx
- 检查配置文件语法:
sudo nginx -t如果显示syntax is ok和test is successful,则配置正确。 - 重载 Nginx 以使配置生效:
sudo systemctl reload nginx # 或者 sudo service nginx reload
验证 HTTPS 是否生效
- 浏览器访问:在浏览器中打开
https://example.com,地址栏左侧应显示一个锁形图标。点击它可以查看证书详情,确认证书有效且属于你的域名。 - 在线 SSL 检测工具:使用 SSL Labs 的测试工具,输入你的域名,它会给出详细的评级(如 A+, A)和配置建议。
故障排除
- Permission denied:检查证书和私钥文件的权限和所有者是否正确。
- SSL: error:0200100D:system library:fopen:Permission denied:Nginx 工作进程(通常是
www-data或nginx用户)无权读取证书文件。确保文件权限为644,目录权限为755。 - 证书不匹配:确保
ssl_certificate指向的是合并了中间证书的fullchain.pem文件,而不仅仅是你的域名证书。 - 502 Bad Gateway:如果你在
location块中使用了proxy_pass,检查后端服务是否正常运行。
按照以上步骤,你应该能够成功地为你的 Nginx 网站配置 HTTPS。对于大多数用户,强烈推荐使用方案一(Let’s Encrypt),因为它免费、自动化且足够安全。

























暂无评论内容