文档中心
Nginx鏈湴瀵煎叆SSL璇佷功鍏ㄦ敾鐣ユ墜鎶婃墜鏁欎綘瀹炵幇HTTPS鍔犲瘑
时间 : 2025-09-27 16:27:07浏览量 : 3
什么是SSL证书?为什么需要它?

想象一下你寄送一封明信片——任何经过的人都能看到上面的内容。HTTP协议就像这样的明信片,而HTTPS(HTTP Secure)则像是把明信片装进了保险箱并上锁。SSL证书就是这个"保险箱的钥匙",它实现了:
1. 加密传输:防止数据在传输过程中被窃听
2. 身份验证:证明你连接的是真正的网站而非钓鱼网站
3. 数据完整性:确保传输过程中数据未被篡改
常见的SSL证书颁发机构(CA)包括Let's Encrypt(免费)、DigiCert、GlobalSign等。这些机构就像互联网世界的"公证处",负责验证网站身份并签发证书。
准备工作:获取SSL证书文件
在开始配置Nginx之前,你需要准备以下文件(通常从证书颁发机构获得):
1. 域名证书文件(通常以.crt或.pem结尾):好比是你的"身份证"
2. *私钥文件*(通常以.key结尾):这是绝对不能泄露的"保险箱密码"
3. *中间证书链文件*(可选):相当于"公证处的授权证明"
例如,你可能会收到:
- `example.com.crt` - 主证书
- `example.com.key` - 私钥
- `intermediate.crt` - 中间证书
> 实际案例:小张的公司购买了商业SSL证书,收到三个文件:`domain.crt`、`private.key`和`CA_bundle.crt`。他将这三个文件放在服务器的`/etc/ssl/certs/`目录下准备配置。
Nginx配置SSL完整步骤
第一步:上传证书文件到服务器
最佳实践是将这些文件放在安全目录中:
```bash
sudo mkdir -p /etc/nginx/ssl/example.com
sudo chmod 700 /etc/nginx/ssl
```
然后上传你的证书文件到这个目录:
sudo cp example.com.crt /etc/nginx/ssl/example.com/
sudo cp example.com.key /etc/nginx/ssl/example.com/
sudo cp intermediate.crt /etc/nginx/ssl/example.com/
第二步:合并证书链(如需)
有些情况需要将主证书和中间证书合并:
cat example.com.crt intermediate.crt > combined.crt
第三步:修改Nginx配置文件
编辑你的站点配置文件(通常在`/etc/nginx/sites-available/your_site`):
```nginx
server {
listen 443 ssl;
server_name example.com www.example.com;
SSL配置开始
ssl_certificate /etc/nginx/ssl/example.com/combined.crt;
ssl_certificate_key /etc/nignx/ssl/exmaple.com/exmaple.com.key;
提高安全性的一些推荐设置
ssl_protocols TLSv1.2 TLSv1.3;
禁用老旧不安全的协议版本
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384...';
HSTS头(增强安全)
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
...其他配置...
}
第四步:测试并重载配置
先测试配置是否正确:
sudo nginx -t
如果显示"syntax is ok",就可以安全地重载Nginx:
sudo systemctl reload nginx
常见问题排查指南
Q1: "SSL_ERROR_RX_RECORD_TOO_LONG"错误
这通常意味着你在用HTTPS访问HTTP端口,或者反之。检查:
1. Nginx是否确实监听443端口(`listen 443 ssl`)
2. 防火墙是否放行443端口(`sudo ufw allow 443/tcp`)
3. CDN或负载均衡器是否配置正确
Q2: "NET::ERR_CERT_AUTHORITY_INVALID"
浏览器不信任你的证书,可能因为:
1. 中间证书缺失 → 确保包含完整的证书链
2. 自签名未导入 → 对于自签名需手动导入到受信任根CA存储区
Q3: "SSL handshake failed"
握手失败可能由多种原因导致:
Debug方法:
openssl s_client -connect example.com:443 -showcerts -debug
常见原因包括:
- 服务器时钟不同步(`ntpdate pool.ntp.org`)
- Cipher suite不匹配(调整ssl_ciphers设置)
- SNI问题(确保现代浏览器支持)
HTTPS优化技巧集锦
HTTP自动跳转HTTPS
在80端口的server块中添加:
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
OCSP Stapling提升性能
减少客户端验证时间:
```nginx
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
resolver_timeout5s;
Session缓存减少握手开销
ssl_session_cache shared:SSL:10m;
≈4万个会话
ssl_session_timeout10m;
Let's Encrypt免费方案对比
如果你不想购买商业证书,Let's Encrypt提供完全免费的方案:
| 比较项 | 商业SSL | Let's Encrypt |
|||-|
|有效期 |1-2年 |90天 |
|支持类型 |DV,OV,EV |仅DV |
|验证方式 |多种选择 |DNS/http挑战 |
|自动续期 |手动 |可自动化 |
使用Certbot自动化工具示例:
```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
自动续期测试:
sudo certbot renew --dry-run
```
SSL安全最佳实践清单
1?? [强制]禁用SSLV3、TLS1.0和TLS1.1等不安全协议
2?? [推荐]启用TLS1.3以获得最佳性能和安全性
3?? [强制]私钥权限设置为600(root只读)
4?? [推荐]定期轮换密钥(即使未泄露)
5?? [监控]设置到期提醒(30天前)
检查工具推荐:
? Qualys SSL Labs测试(https://www.ssllabs.com/)
? Mozilla SSL Config Generator
通过以上步骤,你已经成功为Nginx服务器部署了SSL加密。这不仅保护了用户数据安全,还能提升SEO排名——Google明确表示HTTPS是搜索排名的正面因素。遇到问题时,记住检查错误日志是最快的排错方式:`tail-f /var/log/nignx.error.log`。保持你的加密套件与时俱进,定期更新维护,就能构建既安全又高性能的Web服务。
TAG:nginx 本地导入ssl证书,nginx添加ssl证书,nginx安装ssl,nginx ssl_ciphers