Skip to main content

Nginx配置SSL证书完整教程:从申请到部署

· 5 min read
OHTTPS

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申请的证书:

  1. 在OHTTPS平台配置自动更新
  2. 配置自动部署到服务器
  3. 证书更新后自动部署

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证书的一站式申请、更新、部署、监控和管理。