文档中心
Nginx閰嶇疆SSL鑷鍚嶈瘉涔﹀叏鏀荤暐浠庣敓鎴愬埌閮ㄧ讲璇﹁В
时间 : 2025-09-27 16:27:39浏览量 : 2
什么是自签名证书?

在网络安全领域,SSL/TLS证书就像是网站的"身份证",它用于验证网站身份并加密传输数据。自签名证书(Self-Signed Certificate)顾名思义就是自己给自己颁发的证书,而不是由受信任的第三方CA(证书颁发机构)签发的。
打个比方:正规CA颁发的证书就像是公安局给你发的身份证,大家都认可;而自签名证书就像是你自己手写的一张身份证,虽然也能证明身份,但别人不一定相信它的真实性。
为什么需要自签名证书?
1. 测试环境:在开发或测试阶段使用
2. 内部系统:公司内网使用的系统
3. 学习目的:了解SSL/TLS工作原理
4. 成本考虑:避免购买商业证书的费用
不过要注意的是,自签名证书不适合用于生产环境的公开网站,因为浏览器会显示安全警告,影响用户体验和SEO排名。
OpenSSL工具简介
OpenSSL是一个强大的开源工具包,它实现了SSL/TLS协议以及各种加密算法。我们可以用它来生成密钥、创建证书请求、签发证书等。大多数Linux系统都预装了OpenSSL。
检查是否安装:
```bash
openssl version
```
如果没有安装,可以使用以下命令(以Ubuntu为例):
sudo apt-get install openssl
详细配置步骤
第一步:创建私钥
私钥就像是一把独一无二的钥匙,必须妥善保管。我们首先生成一个2048位的RSA私钥:
openssl genrsa -out server.key 2048
这个命令会生成一个名为`server.key`的文件。-out参数指定输出文件名,"2048"表示密钥长度(越长越安全但性能开销越大)。
第二步:创建CSR(证书签名请求)
CSR包含了你的公钥和相关信息(如域名、组织等),用于申请证书:
openssl req -new -key server.key -out server.csr
执行后会提示输入一些信息:
- Country Name (2 letter code):国家代码(如CN)
- State or Province Name:省/州名
- Locality Name:城市名
- Organization Name:组织名
- Organizational Unit Name:部门名
- Common Name (e.g. server FQDN):最重要的!填写你的域名或IP(如test.example.com)
- Email Address:邮箱地址
这些信息会包含在最终的证书中。
第三步:生成自签名证书
现在我们可以用私钥和CSR来签发自己的证书了:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
这里:
- `-days 365`表示有效期1年(可根据需要调整)
- `-in`指定输入的CSR文件
- `-signkey`指定用来签名的私钥文件
生成的`server.crt`就是我们的自签名SSL证书了。
第四步:Nginx配置SSL
现在我们来配置Nginx使用这个证书。编辑Nginx的站点配置文件(通常在/etc/nginx/sites-available/下):
```nginx
server {
listen 443 ssl;
server_name test.example.com;
替换为你的域名
ssl_certificate /path/to/server.crt;
CRT文件路径
ssl_certificate_key /path/to/server.key;
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;
其他配置...
}
然后测试配置并重启Nginx:
nginx -t && systemctl restart nginx
第五步:验证配置
访问你的HTTPS网址时浏览器会显示安全警告(因为是自签名的),这是正常现象。你可以选择"继续前往"查看效果。
也可以使用命令行工具验证:
curl -vk https://test.example.com
v显示详细信息,k忽略证书错误检查
或者用OpenSSL检查:
openssl s_client -connect test.example.com:443 -showcerts
Chrome/Firefox添加信任的方法
要让浏览器不显示警告,可以将自签名证书添加到系统的信任存储中:
Windows:
1. 双击.crt文件 → "安装证书"
2. "本地计算机" → "将所有证书放入下列存储"
3. "受信任的根证书颁发机构"
MacOS:
1. Keychain Access → File → Import Items...
2. 选择.crt文件 → System keychain
3. Find the certificate → Trust → Always Trust
Linux(Firefox):
Preferences → Privacy & Security → View Certificates → Authorities → Import...
Nginx SSL优化建议
除了基本配置外,还可以添加以下优化参数提升安全性:
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
HSTS (强制HTTPS)
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
OCSP Stapling优化响应速度(对自签意义不大)
ssl_stapling off;
ssl_stapling_verify off;
常见问题解决指南
1. Nginx启动报错"no 'ssl_certificate' is defined"
- 确保ssl_certificate和ssl_certificate_key路径正确且可读
2. ERR_CERT_AUTHORITY_INVALID
- Chrome的安全警告是正常的(因为是自签),可以按上述方法添加信任
3. 私钥权限问题
```bash
chmod 400 server.key
设置仅所有者可读权限
```
4. 域名不匹配错误
- CSR中的Common Name必须与访问的域名完全一致
5. 性能问题
```nginx
ssl_buffer_size 16k;
减少小数据包数量提升性能
Docker环境特殊处理技巧
如果在Docker中使用Nginx+自签证书记得:
1) COPY或Volume挂载.crt和.key文件到容器内正确位置
2) Dockerfile中可能需要安装ca-certificates包
3) --volume "$(pwd)/certs:/etc/nginx/certs"
示例docker-compose.yml片段:
```yaml
services:
nginx:
image: nginx:latest
volumes:
- ./certs/server.crt:/etc/nginx/certs/server.crt:ro
- ./certs/server.key:/etc/nginx/certs/server.key:ro
ports:
- "443:443"
Let's Encrypt免费替代方案说明
虽然本文讲的是自签名方案,但对于生产环境推荐使用Let's Encrypt提供的免费可信CA服务:
```bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx
自动获取并配置可信HTTPS
自动续期设置
sudo certbot renew --dry-run
sudo crontab -e
添加自动续期任务
0 */12 * * * certbot renew --quiet > /dev/null
相比商业CA每年几十到几百美元的费用,Let's Encrypt完全免费且被所有主流浏览器信任!
通过以上详细步骤,你应该已经掌握了在Nginx上配置自签名SSL/TLS的全过程。无论是本地开发还是内部系统,这种方案都能提供加密传输保障,同时避免了商业CA的成本开销。
TAG:nginx 配置ssl自签名证书,nginx加ssl,nginx配置ssl证书无效,nginx ssl_ciphers配置,nginx生成ssl证书