ssl新闻资讯

文档中心

Nginx閰嶇疆SSL鑷鍚嶈瘉涔﹀叏鏀荤暐浠庣敓鎴愬埌閮ㄧ讲璇﹁В

时间 : 2025-09-27 16:27:39浏览量 : 2

什么是自签名证书?

2Nginx閰嶇疆SSL鑷鍚嶈瘉涔﹀叏鏀荤暐浠庣敓鎴愬埌閮ㄧ讲璇﹁В

在网络安全领域,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证书