文档中心
Nginx鏃犺瘉涔TTPS闆舵垚鏈疄鐜扮綉绔欏姞瀵嗕紶杈撶殑濡欐嫑
时间 : 2025-09-27 16:27:00浏览量 : 3
什么是无证书HTTPS?

想象一下这样的场景:你经营着一个内部使用的网站,或者正在开发测试一个新项目,需要HTTPS加密保护数据,但又不想花钱买证书或者折腾免费证书的续期问题。这时候,"无证书HTTPS"就是你的救星!
无证书HTTPS(确切地说应该叫"自签名证书HTTPS")就像是你自己手写了一张身份证——虽然不像公安局发的那么权威,但在你的小圈子里完全够用。它实现了和正规HTTPS同样的加密效果,只是浏览器会显示"不安全"警告而已。
为什么需要无证书HTTPS?
你可能会有疑问:"既然浏览器会警告,那有什么用?"让我用几个实际场景说明:
1. 开发测试环境:程序员小王正在开发一个微信小程序。微信强制要求后端必须使用HTTPS,但测试阶段买证书太麻烦。自签名证书完美解决!
2. 内部系统:某公司HR系统仅限内网使用。IT老张配置自签名HTTPS后,只需让同事一次点击"信任",以后所有通信都加密。
3. 物联网设备:智能家居设备的控制页面通常使用自签名证书,因为你只会通过本地网络访问它。
Nginx配置实战四步走
下面手把手教你用Nginx配置自签名HTTPS(以Ubuntu系统为例):
第一步:生成自签名证书
打开终端,执行以下命令:
```bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt
```
这就像办证时填表格:
- `-days 365`:证件有效期1年
- `rsa:2048`:使用2048位的加密钥匙
- 过程中会问一些信息(国家、公司等),都可以按回车跳过
第二步:配置Nginx
编辑Nginx配置文件(通常在`/etc/nginx/sites-available/default`):
```nginx
server {
listen 443 ssl;
server_name your_domain.com;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
安全强化配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
其他常规配置...
}
第三步:HTTP自动跳转HTTPS(可选)
在80端口的server块中添加:
return 301 https://$host$request_uri;
第四步:重启Nginx
sudo systemctl restart nginx
安全增强技巧
虽然是无证书方案,但我们依然可以提升安全性:
1. 定期更换密钥:
```bash
每年更新一次证书
sudo mv /etc/ssl/private/nginx-selfsigned.key /etc/ssl/private/nginx-selfsigned.key.bak
sudo mv /etc/ssl/certs/nginx-selfsigned.crt /etc/ssl/certs/nginx-selfsigned.crt.bak
重新生成新证书(同第一步)
```
2. 添加Diffie-Hellman参数增强安全性:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
然后在Nginx配置中添加:
```nginx
ssl_dhparam /etc/ssl/certs/dhparam.pem;
3. 启用HSTS头(谨慎使用):
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
浏览器信任技巧
要让浏览器不显示警告,你需要:
1. Chrome/Firefox:点击高级→继续前往(不安全)
2. 全公司部署:将自签名CA证书导入到所有电脑的受信任根证书中
3. 移动设备:通过二维码或邮件发送证书文件手动安装
Let's Encrypt免费方案对比
如果你的网站对外公开,建议还是用Let's Encrypt的免费证书:
| 特性 | 自签名方案 | Let's Encrypt |
|||--|
| 成本 | $0 | $0 |
| 有效期 | 自定义(通常1年) | 90天 |
| 浏览器信任度 | ??显示警告 | ?完全信任 |
| CA机构 | DIY | ISRG(国际认可) |
| OCSP装订 | ?不支持 | ?支持 |
对于公开网站来说Let's Encrypt是更好的选择——只需运行一条命令:
sudo certbot --nginx -d yourdomain.com
就能自动获取并配置正规的免费SSL证书。
Nginx HTTPS性能优化小贴士
即使使用自签名方案,这些优化也适用:
1. 会话复用减少握手开销:
```nginx
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
2. OCSP装订提升速度(需正规CA):
ssl_stapling on;
ssl_stapling_verify on;
3. 开启HTTP2大幅提升性能:
在listen行添加http2:
listen 443 ssl http2;
4. 调整缓冲区大小防溢出:
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers4 4k;
output_buffers 4 32k;
postpone_output 1460;
```
HTTPS安全检测工具推荐
部署完成后建议用这些工具检查:
1. SSL Labs测试(适合公开服务):
https://www.ssllabs.com/
2. OpenSSL命令行检测:
```bash
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
3.Nginx自带测试模式:
sudo nginx -t
4.Curl验证(检查HSTS等头部):
curl -I https://yourdomain.com
5.Chrome开发者工具→Security面板查看详情
HTTPS常见问题排障指南
遇到问题时先检查这些常见坑:
? "SSL_CTX_use_PrivateKey_file"错误 → SSL密钥文件不匹配
?解决方案:重新生成匹配的密钥对
? Chrome报ERR_CERT_AUTHORITY_INVALID → CA不受信任
?解决方案:导入CA或点击继续访问
? Firefox报SEC_ERROR_UNKNOWN_ISSUER → CA未知
?解决方案:about:config → security.insecure_field_warning.contextual.enabled设为false(仅限内网)
? Safari无法验证此服务器身份 → Mac未信任CA
?解决方案:钥匙串访问→添加为始终信任
? AndroidAPP无法请求数据 → Android7+默认不信任用户CA
?解决方案:修改APP网络安全配置或安装CA到系统区
一下, Nginx无证照书HTTPS方案特别适合以下场景:
? ???开发和测试环境快速搭建
? ??企业内部系统部署
? ??家庭NAS/IoT设备管理
? ??临时性的加密需求
记住它的黄金法则:加密有效但身份不可信,所以对公众服务还是应该选择Let's Encrypt等正规CA。希望这篇指南能帮你轻松搞定各种https需求!
TAG:nginx无证书https,nginx 证书,nginx证书完整证书链,nginx ca证书,nginx 证书生成