mr88fang 发表于 2024-12-3 09:48

自签浏览器授信 CA 证书



_此服务器无法证实它就是 `127.0.0.1` - 它的安全证书没有指定主题备用名称。这可能是因为某项配置有误或某个攻击者拦截了您的连接_

自签 `SSL` 证书浏览器不授信,提示连接**不安全**解决办法,自签证书时增加 `SAN` 信息,将证书添加到`受信任的根证书颁发机构`

| 配置前                                                       | 访问拦截                                                      | 配置后                                                       |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| [![配置SSL前](https://s21.ax1x.com/2024/12/03/pAIjq0I.png)](https://imgse.com/i/pAIjq0I)| ![访问拦截](https://s21.ax1x.com/2024/12/03/pAIjbnA.png)| ![配置SSl后](https://s21.ax1x.com/2024/12/03/pAIj7Xd.png) |


### 主题备用名称(SAN)说明:

- **主题备用名称** 是证书的扩展字段,它允许证书支持多个域名或 IP 地址。对于自签证书,如果你希望它能够适用于 127.0.0.1 或 localhost,你需要在生成证书时指定这个 IP 地址或主机名。

- **问题根源**:自签证书通常只会将证书的 Common Name (CN) 字段设置为一个值(如 localhost 或 127.0.0.1),但在现代浏览器中,浏览器更偏向于检查 SAN 字段,以确保安全性。


### 1.创建一个 OpenSSL 配置文件

`openssl.ini`

```ini

[ req ]
default_bits      = 2048
default_keyfile   = privkey.pem
distinguished_name= req_distinguished_name
req_extensions      = v3_req    # 指定请求使用 v3_req 扩展
prompt = no          # 不提示输入

[ req_distinguished_name ]
C= US
ST = California
L= San Francisco
O= My Company
OU = My Department
CN = localhost
emailAddress = admin@mycompany.com

[ v3_req ]
subjectAltName = @alt_names   # 引用 alt_names

[ alt_names ]
DNS.1   = localhost
IP.1    = 127.0.0.1

```

**配置文件说明**:

- **[ req\_distinguished\_name ]** 部分:定义了证书的基本信息,
- C:国家
- ST:省份
- L:城市
- O:组织
- OU:单位
- CN:常见名称
- emailAddress:电子邮件地址

- **[ v3_req ]**:这里指定了扩展字段 `subjectAltName`,并引用了 `alt_names` 部分。
- **[ alt_names ]**:定义了备用名称,`DNS.1` 是域名,`IP.1` 是 IP 地址。这里包括 `localhost` 和 `127.0.0.1`,这样证书会为这两个名称生效。

### 2.生成自签证书

使用这个配置文件来生成证书和私钥:

```bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out certificate.crt -config ./openssl.ini -extensions v3_req
```

这个命令会生成一个包含 **主题备用名称(SAN)** 的自签证书。

- `days 365`:指定证书的有效期为 365 天。
- `nodes`:表示不使用密码保护私钥。
- `newkey rsa:2048`:生成一个新的 2048 位 RSA 密钥对。
- `keyout private.key`:指定私钥的输出文件名。
- `out certificate.crt`:指定证书的输出文件名。
- `config openssl.ini`:指定自定义的 OpenSSL 配置文件。
- `extensions v3_req`:指定证书包含 SAN 扩展

### 3.检查证书

你可以使用工具如 (https://www.openssl.org/) 或浏览器的证书查看器来验证生成的证书是否包含正确的 **SAN**。

使用 `openssl` 命令查看证书:

```bash
openssl x509 -in certificate.crt -text -noout
```

确保在证书信息中可以看到类似下面的部分:

```less
X509v3 extensions:
        X509v3 Subject Alternative Name:
                DNS:localhost, IP Address:127.0.0.1
```

如果不包含以上内容,请更新 `openssl` 重新生成,否则浏览器还是会提示:

_此服务器无法证实它就是 127.0.0.1 - 它的安全证书没有指定**主题备用名称**。这可能是因为某项配置有误或某个攻击者拦截了您的连接_

### 4.导入证书到浏览器

- 双击 `certificate.crt` 安装
1. **安装证书**:-> **本计算机** -> **将所有的证书都放入下列存储** -> **浏览** -> `受信任的根证书颁发机构`
2. 退出浏览器后台(不是关闭标签页)
3. 重新打开访问对应网站
- 谷歌浏览器导入
1. 打开 Chrome 浏览器,进入 `chrome://certificate-manager/`。
2. 选择“本地证书”,管理从 Windows 导入的证书。
3. 在 `受信任的根证书颁发机构` 标签页下,点击“导入”。
4. 选择你生成的自签证书 certificate.crt,然后将其添加到受信任的根证书库中。
5. 重启浏览器

### 总结:

浏览器警告的原因是自签证书没有设置主题备用名称(SAN)。要解决这个问题,生成自签证书时需要指定 SAN,确保包括你打算访问的主机名或 IP 地址(如 `localhost` 和 `127.0.0.1`)。

BrutusScipio 发表于 2024-12-3 10:54

为何行文一股AI味?内容倒是没问题

Appkbox 发表于 2024-12-3 10:32

原来还可以这样,感谢楼主分享

云烟成雨 发表于 2024-12-3 10:41

有用,收藏一下

mr88fang 发表于 2024-12-3 10:58

BrutusScipio 发表于 2024-12-3 10:54
为何行文一股AI味?内容倒是没问题

对一部分AI生成

Simwillbetter 发表于 2024-12-3 11:42

感谢楼主,学习了

xiecj 发表于 2024-12-4 11:10

感谢楼主,学习了

SnopCat 发表于 2024-12-13 11:49

感谢楼主,正好我最近实验课遇到这个问题,看完明白了
页: [1]
查看完整版本: 自签浏览器授信 CA 证书