文档中心
Nginx濡備綍瀹夊叏浣跨敤鑷鍚峉SL璇佷功锛熸墜鎶婃墜鏁欎綘鎼缓鍔犲瘑缃戠珯
时间 : 2025-09-27 16:26:43浏览量 : 3

在网络安全领域,SSL/TLS证书是保护网站数据传输安全的基础设施。虽然大家通常使用Let's Encrypt等免费CA颁发的证书,但在某些内部测试或开发环境中,使用自签名SSL证书也是常见做法。今天我们就来深入探讨如何在Nginx中正确配置自签名SSL证书,既保证安全性又满足特定场景需求。
一、为什么需要自签名SSL证书?
自签名证书(Self-Signed Certificate)是由创建者自己而非受信任的第三方CA(证书颁发机构)签发的数字证书。它同样能实现加密通信,但浏览器会显示"不安全"警告。典型使用场景包括:
1. 内部开发测试环境:开发团队在本地或内网测试HTTPS功能
2. 物联网设备管理界面:路由器、NAS等设备的Web管理后台
3. 临时演示环境:需要快速搭建HTTPS服务的短期项目
4. 微服务间通信:服务网格内部组件间的mTLS认证
举例来说,某电商公司的支付系统开发团队需要在隔离环境中测试支付流程,他们就可以使用自签名证书来模拟生产环境的HTTPS连接,而不用担心真实证书的申请和续期问题。
二、生成自签名SSL证书详细步骤
1. 安装OpenSSL工具
大多数Linux系统已预装OpenSSL,可通过以下命令检查:
```bash
openssl version
```
如果未安装,在Ubuntu/Debian上运行:
sudo apt-get install openssl
2. 生成私钥和证书
创建一个专用目录存放密钥文件:
mkdir -p ~/ssl_certs && cd ~/ssl_certs
生成2048位的RSA私钥(关键安全参数):
openssl genrsa -out server.key 2048
然后生成CSR(证书签名请求):
openssl req -new -key server.key -out server.csr
系统会交互式询问信息:
- Country Name (2 letter code): CN
- State or Province Name: Beijing
- Locality Name: Beijing
- Organization Name: MyCompany
- Organizational Unit Name: IT Dept
- Common Name: test.example.com (必须与访问域名一致)
- Email Address: admin@example.com
最后生成有效期为365天的自签名证书:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
三、Nginx配置最佳实践
将生成的server.key和server.crt文件复制到Nginx配置目录:
sudo cp server.crt /etc/nginx/ssl/
sudo cp server.key /etc/nginx/ssl/
sudo chmod 600 /etc/nginx/ssl/server.key
关键权限设置!
编辑Nginx站点配置文件(通常在/etc/nginx/sites-available/):
```nginx
server {
listen 443 ssl;
server_name test.example.com;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
增强SSL安全性配置
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=63072000" always;
location / {
root /var/www/html;
index index.html;
}
}
测试配置并重载Nginx:
sudo nginx -t && sudo systemctl reload nginx
四、解决浏览器警告问题
访问网站时你会看到类似这样的警告:

这是因为自签名证书不被浏览器信任。解决方法有:
1. 手动添加例外(仅适合临时测试)
- Chrome:点击"高级"→"继续前往"
- Firefox:点击"接受风险并继续"
2. 将根证书导入系统信任库(适合内网环境)
```bash
Linux系统示例:
sudo cp ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
Windows双击.crt文件→安装证书→选择"受信任的根证书颁发机构"
```
3. 为设备部署企业策略(企业环境最佳方案)
五、高级安全加固建议
1. 设置更强的密钥参数:
```bash
openssl genpkey -algorithm RSA \
-pkeyopt rsa_keygen_bits:4096 \
-out server.key
2. 添加Subject Alternative Names (SAN):
创建san.cnf文件:
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
IP.1 = 192.168.1.100
3. 定期轮换密钥(建议每90天更换一次)
4. 启用OCSP Stapling提升性能:
在Nginx配置中添加:
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
resolver_timeout 5s;
六、生产环境替代方案
虽然自签名证书有其用途,但生产环境建议考虑:
1. Let's Encrypt免费证书 + certbot自动化工具
2. Cloudflare等CDN提供的边缘证书
3..企业级CA颁发的OV/EV证书
例如用certbot获取Let's Encrypt只需两行命令:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d yourdomain.com
七、常见问题排查指南
Q1: Nginx报错"SSL_CTX_use_PrivateKey_file" failed
原因:私钥与证书记录不匹配 →重新生成配对
Q2: Chrome ERR_CERT_AUTHORITY_INVALID
原因:未正确导入根证 →按第四节方法处理
Q3: SSL握手失败
检查协议支持情况:`openssl s_client connect example.com:443`
Q4: iOS设备无法信任证
需通过描述文件或MDM解决方案分发
通过以上步骤和注意事项,你可以在保证安全性的前提下灵活运用自签名SSL满足特定业务需求。记住要定期审计你的加密配置是否符合最新安全标准!
TAG:nginx使用自己生成的ssl证书,nginx ssl pem,nginx添加ssl证书,nginx的ssl证书格式