Nginx 实战系列(八)—— Nginx SSL/TLS 配置指南
文章目录
- 前言
- 一、准备工作:安装 Nginx
- 1.4 验证 Nginx 运行状态
- 二、获取 SSL/TLS 证书
- 2.1 使用 Let’s Encrypt 免费证书(推荐用于生产环境)
- 2.1.1 安装 Certbot 及 Nginx 插件
- 2.1.2 获取 SSL 证书
- 2.1.3 配置证书自动续期
- 2.2 创建自签名证书(适用于测试环境)
- 2.2.1 创建存储目录
- 2.2.2 生成私钥和证书签名请求(CSR)
- 2.2.3 生成自签名证书
- 2.2.4 验证证书文件
- 三、配置 Nginx 启用 SSL/TLS
- 3.1 编辑 Nginx 配置文件
- 3.2 配置 SSL 证书及加密设置
- 3.3 配置 HTTP 到 HTTPS 的重定向
- 3.4 启用 HTTP/2(可选)
- 四、强化 SSL/TLS 安全性
- 4.1 禁用弱加密协议
- 4.2 启用 HTTP 严格传输安全(HSTS)
- 4.3 配置强 Diffie-Hellman 参数
- 4.4 优化加密套件配置
- 五、验证配置
- 5.1 检查 Nginx 配置语法
- 5.2 重启 Nginx 服务
- 5.3 测试 HTTPS 访问
- 六、定期更新证书
- 6.1 监控证书有效期
- 6.2 自动化续期策略
- 总结
前言
在当今互联网环境中,保障网站数据传输的安全性至关重要。SSL/TLS 协议通过对通信内容进行加密,有效防止数据被窃取或篡改,提升用户信任度和网站安全性。Nginx 作为一款高性能的 Web 服务器,提供了灵活且强大的 SSL/TLS 配置功能。
本文将详细介绍如何在 Nginx 中配置 SSL/TLS,涵盖从证书获取到安全性强化的完整流程,适用于生产环境与测试环境。
一、准备工作:安装 Nginx
安装步骤可参考Nginx 实战系列(一)—— Web 核心概念、HTTP/HTTPS协议 与 Nginx 安装
当然,我也提供了一键安装脚本:Nginx 实战系列(七)—— Nginx一键安装脚本详解
1.4 验证 Nginx 运行状态
通过浏览器访问服务器 IP 地址(如 http://your_server_ip
),若显示 Nginx 默认欢迎页,则表示安装成功。也可通过以下命令查看服务状态:
sudo systemctl status nginx
二、获取 SSL/TLS 证书
SSL/TLS 证书是启用 HTTPS 加密的基础。可根据实际需求选择使用 Let’s Encrypt 免费证书或自签名证书。
2.1 使用 Let’s Encrypt 免费证书(推荐用于生产环境)
Let’s Encrypt 提供免费、自动续期的 SSL/TLS 证书,可通过 Certbot 工具快速获取和配置。
2.1.1 安装 Certbot 及 Nginx 插件
执行以下命令安装 Certbot 和其 Nginx 插件:
sudo yum install epel-release -y
sudo yum install certbot python2-certbot-nginx -y
2.1.2 获取 SSL 证书
运行以下命令,为您的域名申请证书(请替换 yourdomain.com
为实际域名):
sudo certbot --nginx --nginx-server-root /usr/local/nginx/conf -d yourdomain.com -d www.yourdomain.com
Certbot 将自动获取证书并重新加载 Nginx 配置。
2.1.3 配置证书自动续期
Let’s Encrypt 证书有效期为 90 天,建议设置定时任务自动续期:
sudo crontab -e
添加以下内容,每天午夜检查并续期:
0 0 * * * /usr/bin/certbot renew --quiet
Let’s Encrypt 免费证书注意点:
1、域名类型
- 真实注册的公开域名(如 example.com):可以直接申请证书
- 本地测试域名(如 simoncwh.com但未实际注册):无法通过公开 CA 验证
- 本地hosts映射(如 127.0.0.1 simoncwh.com):无法通过公开 CA 验证
2、Let’s Encrypt 会验证您对该域名的所有权,它会:
- 向您的域名发起 HTTP 请求
- 或要求您添加 DNS TXT 记录
- 验证您是否真正控制该域名
2.2 创建自签名证书(适用于测试环境)
自签名证书可用于本地开发或测试,但浏览器会提示不安全,不建议在生产环境中使用。
2.2.1 创建存储目录
sudo mkdir -p /usr/local/nginx/ssl/private
sudo mkdir -p /usr/local/nginx/ssl/certs
2.2.2 生成私钥和证书签名请求(CSR)
openssl genpkey -algorithm RSA -out /usr/local/nginx/ssl/private/nginx-selfsigned.key -pkeyopt rsa_keygen_bits:2048
openssl req -new -key /usr/local/nginx/ssl/private/nginx-selfsigned.key -out /usr/local/nginx/ssl/certs/nginx-selfsigned.csr
在执行过程中需填写以下信息(示例):
- Country Name(国家代码):CN
- State or Province Name(省/州):Beijing
- Locality Name(城市):Beijing
- Organization Name(组织名称):MyCompany Ltd
- Organizational Unit Name: (部门名):IT Department(可留空)
- Common Name(域名):example.com
- Email Address(邮箱):admin@example.com
2.2.3 生成自签名证书
openssl x509 -req -days 365 -in /usr/local/nginx/ssl/certs/nginx-selfsigned.csr -signkey /usr/local/nginx/ssl/private/nginx-selfsigned.key -out /usr/local/nginx/ssl/certs/nginx-selfsigned.crt
2.2.4 验证证书文件
确保自签名证书(.crt
)和私钥(.key
)文件已正确生成并存放在指定路径。
证书应该已经保存在 /usr/local/nginx/ssl/certs/nginx-selfsigned.crt
,密钥文件保存在 /usr/local/nginx/ssl/private/nginx-selfsigned.key
。
三、配置 Nginx 启用 SSL/TLS
3.1 编辑 Nginx 配置文件
使用文本编辑器打开 Nginx 配置文件:
vim /usr/local/nginx/conf/nginx.conf
3.2 配置 SSL 证书及加密设置
在配置文件中添加以下 server
块,启用 SSL 并指定证书路径:
server {listen 443 ssl;server_name simoncwh.com www.simoncwh.com;# 指定SSL证书文件路径(PEM格式,通常包含公钥和证书链)ssl_certificate /usr/local/nginx/ssl/certs/nginx-selfsigned.crt;# 指定SSL证书私钥文件路径ssl_certificate_key /usr/local/nginx/ssl/private/nginx-selfsigned.key;# 启用TLS协议版本,禁用不安全的TLSv1.0/TLSv1.1ssl_protocols TLSv1.2 TLSv1.3;# 配置加密套件ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";# 优先使用服务端配置的加密套件顺序ssl_prefer_server_ciphers on;location / {root /usr/share/nginx/html;index index.html;}
}
配置说明:
listen 443 ssl
:监听 443 端口并启用 SSL。ssl_certificate
和ssl_certificate_key
:指定证书和私钥路径。ssl_protocols
:仅允许 TLSv1.2 和 TLSv1.3,禁用不安全协议。ssl_ciphers
:指定优先使用的加密套件。ssl_prefer_server_ciphers
:由服务器决定加密方式,提升安全性。
3.3 配置 HTTP 到 HTTPS 的重定向
为实现全站 HTTPS,添加以下配置将 HTTP 请求重定向至 HTTPS:
server {listen 80;server_name simoncwh.com www.simoncwh.com;return 301 https://$host$request_uri;
}
3.4 启用 HTTP/2(可选)
HTTP/2 可提升网站加载性能。在 SSL 配置中增加 http2
参数:
server {listen 443 ssl http2;...
}
四、强化 SSL/TLS 安全性
4.1 禁用弱加密协议
仅启用安全的 TLS 协议版本:
ssl_protocols TLSv1.2 TLSv1.3;
4.2 启用 HTTP 严格传输安全(HSTS)
HSTS 可强制浏览器使用 HTTPS 访问网站,减少中间人攻击风险:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
4.3 配置强 Diffie-Hellman 参数
生成 2048 位的 DH 参数文件:
sudo openssl dhparam -out /usr/local/nginx/ssl/certs/dhparam.pem 2048
在 Nginx 配置中引用该文件:
ssl_dhparam /usr/local/nginx/ssl/certs/dhparam.pem;
4.4 优化加密套件配置
选择现代加密套件,禁用已知弱算法:
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
五、验证配置
5.1 检查 Nginx 配置语法
执行以下命令验证配置文件是否正确:
sudo nginx -t
5.2 重启 Nginx 服务
若配置检查通过,重新加载 Nginx 使配置生效:
sudo systemctl restart nginx
5.3 测试 HTTPS 访问
- 浏览器访问:打开
https://simoncwh.com
,确认地址栏显示安全锁标志。
- 命令行测试:使用
curl
命令验证响应头是否包含 HTTPS 相关信息:curl -I https://www.simoncwh.com
六、定期更新证书
6.1 监控证书有效期
无论是使用 Let’s Encrypt 还是自签名证书,都需关注证书有效期,避免因证书过期导致服务中断。
6.2 自动化续期策略
若使用 Let’s Encrypt,可通过之前设置的 Cron 任务自动续期。自签名证书需手动重新生成和部署。
总结
通过本指南,您已完成:
1、Nginx 基础安装与验证
2、SSL/TLS 证书获取(Let’s Encrypt 或自签名)
3、HTTPS 服务配置与安全强化(HSTS/加密套件/DH 参数)
4、配置验证与自动化维护
建议在生产环境中始终使用可信证书颁发机构(如 Let’s Encrypt)签发的证书,并定期更新和维护 SSL/TLS 配置,以应对不断演进的网络安全威胁。
附录:
如需进一步优化性能或配置更复杂的 SSL 策略,可参考 Nginx 官方文档或使用在线 SSL 配置生成工具(如 Mozilla SSL Configuration Generator)。