【Nginx 进阶】SSL/TLS 配置
【Nginx进阶】系列文章目录
【Nginx 进阶】1、Nginx 高级配置
【Nginx 进阶】2、模块化设计
【Nginx 进阶】3、负载均衡策略
【Nginx 进阶】4、SSL/TLS 配置(本文)
【Nginx 进阶】5、Nginx 性能优化
【Nginx 进阶】6、Nginx 与第三方服务集成
【Nginx 进阶】7、安全配置
【Nginx 进阶】8、Nginx 高可用性
【Nginx 进阶】9、监控和调试
SSL/TLS 是确保 Web 应用安全性的关键技术,它通过加密保护数据传输的机密性、完整性和真实性。Nginx 作为高性能的 Web 服务器和反向代理服务器,提供了强大的 SSL/TLS 支持。在本章中,我们将详细介绍 Nginx 的 SSL/TLS 配置,包括基础配置、优化、证书管理和常见问题解决。
1. SSL/TLS 基础配置
1.1 生成 SSL 证书
在配置 SSL/TLS 之前,你需要一个 SSL 证书。你可以使用自签名证书进行测试,或者从受信任的证书颁发机构(CA)获取正式证书。
1.1.1 生成自签名证书
使用 OpenSSL 生成自签名证书:
# 生成私钥
openssl genpkey -algorithm RSA -out /etc/nginx/ssl/nginx.key
# 生成自签名证书
openssl req -new -x509 -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt -days 365
1.2 基本 SSL 配置
在 Nginx 配置文件中启用 SSL/TLS:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
在这个配置中:
listen 443 ssl;
:Nginx 监听 443 端口并启用 SSL。ssl_certificate
和ssl_certificate_key
:指定 SSL 证书和私钥的路径。
2. SSL/TLS 优化
为了提高 SSL/TLS 的安全性和性能,可以进行一些优化配置。
2.1 启用 HTTP/2
HTTP/2 提供了更高效的网络传输,可以显著提高网站的性能。启用 HTTP/2:
server {
listen 443 ssl http2;
...
}
2.2 强制使用安全协议和加密套件
为了确保连接的安全性,禁用不安全的协议和弱加密套件:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# 禁用 SSLv3 和弱加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
# HSTS 头,增强安全性
add_header Strict-Transport-Security "max-age=31536000" always;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
2.3 启用 OCSP Stapling
OCSP Stapling 可以减少 SSL 握手时间,提高性能:
server {
...
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/chain.pem; # CA 证书链
...
}
2.4 使用 Diffie-Hellman 参数
生成 Diffie-Hellman 参数文件并配置:
# 生成 DH 参数文件
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
在 Nginx 配置中使用:
server {
...
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
...
}
3. 重定向 HTTP 到 HTTPS
为了确保所有流量都通过 HTTPS 加密,可以将 HTTP 请求重定向到 HTTPS:
server {
listen 80;
server_name example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
4. 多域名和子域名配置
Nginx 支持多域名和子域名的 SSL 配置,可以在同一个服务器块中配置多个域名:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
5. SSL/TLS 证书管理
5.1 Let’s Encrypt 自动化证书管理
Let’s Encrypt 提供免费可信的 SSL 证书,可以使用 Certbot 工具实现自动化证书管理:
5.1.1 安装 Certbot
在 Ubuntu 上安装 Certbot:
sudo apt update
sudo apt install certbot python3-certbot-nginx
5.1.2 生成和安装证书
使用 Certbot 自动生成和安装证书:
sudo certbot --nginx -d example.com -d www.example.com
5.1.3 自动续期
Certbot 自动续期服务会定期检查和更新证书,无需手动干预:
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
5.2 手动更新证书
如果你使用的是付费证书,需要定期手动更新证书。更新证书后,重新加载 Nginx 配置:
sudo systemctl reload nginx
6. 常见问题解决
6.1 SSL 证书无效或过期
检查证书路径和文件权限,确保 Nginx 用户有权限访问证书文件。如果证书过期,请及时更新证书。
6.2 浏览器不信任证书
如果使用自签名证书,浏览器可能会警告不信任。对于生产环境,建议使用受信任的 CA 颁发的证书。
6.3 SSL 连接性能差
启用 HTTP/2、OCSP Stapling 和优化加密套件可以提高 SSL 连接的性能。
7. 完整示例
下面是一个综合了多种 SSL/TLS 配置和优化的完整示例:
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name example.com www.example.com;
location / {
return 301 https://$server_name$request_uri;
}
}
# HTTPS 配置
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
add_header Strict-Transport-Security "max-age=31536000" always;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
8. 总结
在本章中,我们详细介绍了 Nginx 的 SSL/TLS 配置,包括基础配置、优化、证书管理和常见问题解决。通过这些配置,你可以提升网站的安全性,确保数据传输的机密性和完整性。在接下来的教程中,我们将探讨 Nginx 的性能优化,敬请期待!