Nginx是最流行的Web服务器之一,正确配置SSL证书对于保障网站安全至关重要。本文将详细介绍如何在Nginx服务器上配置SSL证书,包括证书安装、SSL配置优化、HTTP到HTTPS重定向和安全配置,帮助您快速部署HTTPS网站。
一、准备工作
1. 获取SSL证书
在配置Nginx之前,您需要:
- 已申请SSL证书(从OHTTPS、Let's Encrypt等)
- 证书文件(.crt或.pem)
- 私钥文件(.key)
- 证书链文件(chain.crt,可选但推荐)
2. 上传证书文件
将证书文件上传到服务器:
# 创建证书目录
sudo mkdir -p /etc/nginx/ssl
# 上传证书文件
sudo cp certificate.crt /etc/nginx/ssl/
sudo cp private.key /etc/nginx/ssl/
sudo cp chain.crt /etc/nginx/ssl/
# 设置文件权限
sudo chmod 600 /etc/nginx/ssl/private.key
sudo chmod 644 /etc/nginx/ssl/certificate.crt
sudo chmod 644 /etc/nginx/ssl/chain.crt
二、基本SSL配置
1. 编辑Nginx配置文件
编辑站点配置文件(通常在 /etc/nginx/sites-available/ 目录):
sudo nano /etc/nginx/sites-available/example.com
2. 添加SSL配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;
# 证书链(推荐)
ssl_trusted_certificate /etc/nginx/ssl/chain.crt;
# SSL协议配置
ssl_protocols TLSv1.2 TLSv1.3;
# SSL加密套件
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
# 其他配置...
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
3. 测试配置
# 测试Nginx配置
sudo nginx -t
# 如果测试通过,重载Nginx
sudo systemctl reload nginx
三、HTTP到HTTPS重定向
1. 添加HTTP重定向
# HTTP服务器块 - 重定向到HTTPS
server {
listen 80;
server_name example.com www.example.com;
# 重定向所有HTTP请求到HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS服务器块
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL配置...
}
2. 使用HSTS
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL配置...
# HSTS(HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 其他配置...
}
四、SSL配置优化
1. 完整的安全配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL证书
ssl_certificate /etc/nginx/ssl/certificate.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;
ssl_trusted_certificate /etc/nginx/ssl/chain.crt;
# SSL协议
ssl_protocols TLSv1.2 TLSv1.3;
# SSL加密套件(TLS 1.3会自动选择,这里主要配置TLS 1.2)
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off;
# SSL会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_stapling_file /etc/nginx/ssl/chain.crt;
# 安全头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# 其他配置...
}
2. SSL性能优化
# 在http块中添加(影响所有server块)
http {
# SSL优化
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# 其他配置...
}
五、多域名配置
1. 单证书多域名
server {
listen 443 ssl http2;
server_name example.com www.example.com api.example.com;
# SSL配置...
}
2. 多证书配置
# 第一个域名
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 其他配置...
}
# 第二个域名
server {
listen 443 ssl http2;
server_name another.com;
ssl_certificate /etc/nginx/ssl/another.com.crt;
ssl_certificate_key /etc/nginx/ssl/another.com.key;
# 其他配置...
}
六、通配符证书配置
1. 通配符证书配置
server {
listen 443 ssl http2;
server_name *.example.com;
# SSL配置...
ssl_certificate /etc/nginx/ssl/wildcard.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
# 其他配置...
}
2. 通配符+主域名
# 主域名
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
# 其他配置...
}
# 通配符子域名
server {
listen 443 ssl http2;
server_name *.example.com;
ssl_certificate /etc/nginx/ssl/wildcard.example.com.crt;
ssl_certificate_key /etc/nginx/ssl/wildcard.example.com.key;
# 其他配置...
}
七、常见问题排查
1. 证书链不完整
问题:浏览器显示"证书不受信任"
解决方法:
# 使用完整链文件
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_trusted_certificate /etc/nginx/ssl/chain.crt;
2. 混合内容警告
问题:HTTPS页面加载HTTP资源
解决方法:
# 启用内容安全策略
add_header Content-Security-Policy "upgrade-insecure-requests" always;
3. SSL握手失败
问题:客户端无法建立SSL连接
解决方法:
- 检查SSL协议版本配置
- 检查加密套件配置
- 检查防火墙设置
- 查看Nginx错误日志
八、测试SSL配置
1. 使用SSL Labs测试
访问 https://www.ssllabs.com/ssltest/ 输入您的域名,查看SSL配置评分。
2. 使用命令行测试
# 测试SSL连接
openssl s_client -connect example.com:443 -servername example.com
# 检查证书信息
openssl x509 -in /etc/nginx/ssl/certificate.crt -text -noout
3. 检查HTTP/2
# 检查HTTP/2支持
curl -I --http2 https://example.com
九、证书自动更新
1. 使用OHTTPS自动更新
如果使用OHTTPS申请的证书:
- 在OHTTPS平台配置自动更新
- 配置自动部署到服务器
- 证书更新后自动部署
2. 使用acme.sh自动更新
# acme.sh会自动创建cron任务
# 证书更新后自动重载Nginx
~/.acme.sh/acme.sh --install-cert -d example.com \
--reloadcmd "systemctl reload nginx"
3. 使用Certbot自动更新
# 测试自动更新
sudo certbot renew --dry-run
# Certbot会自动创建systemd timer
十、最佳实践
1. 安全配置
- ✅ 使用TLS 1.2或更高版本
- ✅ 禁用不安全的加密套件
- ✅ 启用HSTS
- ✅ 启用OCSP Stapling
- ✅ 配置安全响应头
2. 性能优化
- ✅ 启用HTTP/2
- ✅ 配置SSL会话缓存
- ✅ 使用强加密但不过度消耗资源
- ✅ 启用OCSP Stapling减少延迟
3. 证书管理
- ✅ 定期更新证书
- ✅ 监控证书到期时间
- ✅ 备份证书和私钥
- ✅ 使用自动化工具管理证书
总结
正确配置Nginx的SSL证书是保障网站安全的重要步骤。通过本文的指导,您可以:
- ✅ 正确安装和配置SSL证书
- ✅ 优化SSL配置提升安全性
- ✅ 配置HTTP到HTTPS重定向
- ✅ 启用安全特性(HSTS、OCSP Stapling等)
- ✅ 实现证书自动更新
记住定期更新证书,监控SSL配置,确保网站始终使用最新的安全配置。如果您需要申请免费SSL证书,推荐使用OHTTPS平台,它提供了完整的证书管理和自动部署功能。
OHTTPS: 免费HTTPS证书/SSL证书申请 • 自动化更新、部署、监控
OHTTPS 支持通过多种域名验证方式(DNS验证、HTTP验证、文件验证等)申请免费的HTTPS证书/SSL证书,包括单域名证书、多域名证书、通配符证书、IP证书等,支持HTTPS证书/SSL证书的自动化更新、自动化部署、自动化监控及告警等,并支持将HTTPS证书/SSL证书自动化部署至阿里云、腾讯云、群晖NAS、百度云、七牛云、多吉云、又拍云、宝塔面板、Docker容器、SSH等,实现HTTPS证书/SSL证书的一站式申请、更新、部署、监控和管理。