文章目录
- Nginx配置SSL详解
- 1. SSL/TLS 基础知识
- 2. 准备工作
- 3. 获取SSL证书
- 4. Nginx SSL配置步骤
- 4.1 基础配置
- 4.2 配置说明
- 5. 常见配置示例
- 5.1 双向认证配置
- 5.2 多域名SSL配置
- 6. 安全优化建议
- 7. 故障排查
- 总结
- 参考资源
- 下载验证的完整实例
Nginx配置SSL详解
1. SSL/TLS 基础知识
SSL (Secure Sockets Layer) 和其继任者 TLS (Transport Layer Security) 是用于在网络通信中提供安全性的加密协议。它们可以确保:
- 数据加密:确保数据传输的私密性
- 身份认证:验证服务器的身份
- 数据完整性:确保数据在传输过程中未被篡改
2. 准备工作
在配置Nginx SSL之前,需要准备以下内容:
- 已安装的Nginx服务器
- 域名
- SSL证书(包含以下文件):
- 证书文件(通常是 .crt 或 .pem 文件)
- 私钥文件(通常是 .key 文件)
- 证书链文件(如果需要)
3. 获取SSL证书
获取SSL证书的方式有多种:
类型 | 来源/方法 | 特点 | 适用场景 |
---|---|---|---|
免费SSL证书 | Let’s Encrypt | 有效期90天,支持自动续签,需域名验证,适合个人或测试环境 | 个人博客、小型网站 |
云服务商(阿里云、腾讯云) | 提供免费DV证书,有效期1年,需控制台申请,集成服务器部署工具 | 国内云服务器用户 | |
JoySSL | 通过注册码获取,支持一年期免费证书,提供技术指导 | 预算有限的个人或企业 | |
付费SSL证书 | 官方CA机构(Symantec, DigiCert) | 支持OV/EV证书,验证企业身份,含高额商业保险,浏览器显示绿色公司名称 | 电商、金融等高安全性需求网站 |
云服务商(GeoTrust, RapidSSL) | 提供多种类型(单域名/多域名/通配符),价格低于官方渠道,支持快速签发 | 多子域名或跨域名的企业网站 | |
自签名证书 | OpenSSL工具生成 | 无需费用,但浏览器提示“不安全”,需手动信任 | 内部测试环境、开发调试 |
自动化工具 | acme.sh + Let’s Encrypt | 命令行自动申请和续签,支持DNS验证,可与crontab结合实现全自动化管理 | 技术型用户、需长期维护的服务器 |
特殊场景证书 | IP证书(JoySSL) | 直接为IP地址颁发证书,验证IP管理权限,支持DVIP(基础验证)和OVIP(企业验证) | 无域名或纯IP访问的服务 |
使用openssl生成证书
- 生成私钥
openssl genrsa -out private.key 2048 # 生成2048位RSA私钥
- 可选加密保护:添加
-des3
参数加密私钥(需输入密码)。
- 创建证书签名请求(CSR)
openssl req -new -key private.key -out request.csr
- 填写信息:需输入国家代码(如 CN)、省份、组织名称、Common Name(域名或 IP)等。
- 自签名生成证书
openssl x509 -req -in request.csr -signkey private.key -out certificate.crt -days 365
- 参数说明:
-days 365
设置证书有效期(1年),可调整。
4. Nginx SSL配置步骤
4.1 基础配置
以下是一个基本的Nginx SSL配置示例:
server {listen 443 ssl;server_name example.com;# SSL证书配置ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;# SSL协议配置ssl_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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;ssl_prefer_server_ciphers off;# SSL会话配置ssl_session_timeout 1d;ssl_session_cache shared:SSL:50m;ssl_session_tickets off;# HSTS配置(可选)add_header Strict-Transport-Security "max-age=63072000" always;location / {root /usr/share/nginx/html;index index.html index.htm;}
}# HTTP重定向到HTTPS
server {listen 80;server_name example.com;return 301 https://$server_name$request_uri;
}
4.2 配置说明
listen 443 ssl
: 在443端口启用SSLssl_certificate
: 指定证书文件路径ssl_certificate_key
: 指定私钥文件路径ssl_protocols
: 指定支持的SSL/TLS协议版本ssl_ciphers
: 指定加密算法套件ssl_session_cache
: 配置SSL会话缓存ssl_session_timeout
: 设置SSL会话超时时间
5. 常见配置示例
5.1 双向认证配置
server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/server.crt;ssl_certificate_key /path/to/server.key;# 客户端证书验证ssl_client_certificate /path/to/ca.crt;ssl_verify_client on;
}
5.2 多域名SSL配置
server {listen 443 ssl;server_name site1.example.com;ssl_certificate /path/to/site1.crt;ssl_certificate_key /path/to/site1.key;
}server {listen 443 ssl;server_name site2.example.com;ssl_certificate /path/to/site2.crt;ssl_certificate_key /path/to/site2.key;
}
6. 安全优化建议
-
启用HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
-
优化SSL会话重用
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
-
配置OCSP Stapling
ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s;
-
禁用不安全的SSL/TLS版本
ssl_protocols TLSv1.2 TLSv1.3;
7. 故障排查
常见问题及解决方案:
-
证书链不完整
- 检查证书文件是否包含完整的证书链
- 使用
openssl verify
命令验证证书
-
私钥不匹配
- 使用
openssl rsa -in private.key -check
验证私钥 - 确保证书和私钥是配对的
- 使用
-
权限问题
- 确保Nginx进程有权限读取证书文件
- 检查证书文件权限:
chmod 644 certificate.crt
- 检查私钥文件权限:
chmod 600 private.key
-
配置语法错误
- 使用
nginx -t
检查配置文件语法 - 查看错误日志:
tail -f /var/log/nginx/error.log
- 使用
总结
正确配置Nginx SSL不仅可以保护网站的安全性,还能提升用户信任度和搜索引擎排名。通过遵循以上配置指南和最佳实践,可以确保网站具有强大的SSL/TLS安全性。记住要定期更新证书,及时应用安全补丁,并持续监控SSL配置的有效性。
参考资源
- Nginx官方文档
- Mozilla SSL配置生成器
- Let’s Encrypt官网
- SSL Labs Server Test
下载验证的完整实例
docker部署nginx验证
nginx构建命令
docker run --name=ssl --network=host -v /home/jykj/nginxssl/dist:/usr/share/nginx/html -v /home/jykj/nginxssl:/etc/nginx -v /home/jykj/nginxssl/logs:/var/log/nginx -d nginx