# NET::ERR_CERT_INVALID：证书格式错误或违反规则怎么办

> NET::ERR_CERT_INVALID 表示 Chrome 认为证书本身有问题：编码错误、扩展不合规或违反规则，多见于自己生成的证书。

Source: https://ssl.sh/zh/errors/net-err-cert-invalid/
Last updated: 2026-11-10

**NET::ERR_CERT_INVALID 的意思是：Chrome 能建立连接，但发现证书本身是坏的，或者违反了它的规则。** 这不是日期、域名或签发者的问题（那些有各自的代码），多出现在自己生成的证书、企业内部 CA 和拦截 HTTPS 的软件上。

## 先判断是网站的问题还是你电脑的问题

SSL 检测也提示证书有问题，就是服务器的证书格式不对；检测正常，就是你的设备或网络换掉了证书。对比 [SSL 检测](https://ssl.sh/zh/tools/ssl-checker/) 看到的和你浏览器看到的：

```bash
curl ssl.sh/example.com
```

- **检测也提示证书有问题**：服务器上的证书格式不对，只有站长能修。
- **检测显示正常的公开证书**：你的设备或网络上有东西换掉了证书，通常是杀毒软件的 HTTPS 扫描、公司代理，或者老版本的拦截产品生成了新版 Chrome 不再接受的证书。见 [杀毒软件 HTTPS 扫描](https://ssl.sh/zh/errors/antivirus-https-scanning-ssl-error/)。

## 原因

问题都出在证书本身的结构上，最常见的是手工生成的证书缺扩展或扩展写错。

### 1. 手工生成的证书缺扩展或扩展写错

有些脚本生成的证书没有 SAN、服务器证书写了 `CA:TRUE`，或者密钥用途字段互相矛盾。查看方法：

```bash
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -text | sed -n '/X509v3 extensions/,/Signature Algorithm/p'
```

重点看 `Basic Constraints`、`Key Usage`、`Extended Key Usage`、`Subject Alternative Name` 四项。

### 2. 有无法识别的关键扩展或编码错误

标为 critical 的扩展 Chrome 不认识，或者某个有 bug 的工具生成了错误的 DER 编码，证书就是无效的。用标准工具重新生成。

### 3. 密钥用途和握手方式不符

密钥用途禁止了握手要用的操作，Chrome 可能报这个代码，也可能报更具体的 [ERR_SSL_KEY_USAGE_INCOMPATIBLE](https://ssl.sh/zh/errors/err-ssl-key-usage-incompatible/)。

### 4. 拦截类产品生成的证书有问题

老版本的 HTTPS 扫描工具、上网行为管理设备生成的证书可能不符合新版 Chrome 的要求。升级产品，或关闭 HTTPS 扫描功能。

### 5. 本地信任证书的平台规则

苹果对 TLS 证书的要求（必须有 SAN、RSA 至少 2048 位、SHA-2 签名、EKU 含 serverAuth）适用于 Safari 和使用苹果验证器的 App，也是内部证书的一个好基准。

## 在各浏览器/系统上的样子

Chrome 系浏览器统一报 `NET::ERR_CERT_INVALID`，Firefox 会按具体问题给出不同的代码。

| 浏览器 | 显示内容 |
|---|---|
| Chrome / Edge / 360 / QQ 浏览器 | “您的连接不是私密连接”，代码 `NET::ERR_CERT_INVALID` |
| Firefox | 不固定：`SEC_ERROR_BAD_DER`、`SEC_ERROR_INADEQUATE_KEY_USAGE` 或 `SEC_ERROR_UNKNOWN_CRITICAL_EXTENSION` |
| Safari | “此连接非私人连接”，说明证书无效 |

## 站长怎么修

能用公开证书就用公开证书；必须内部签发时，按公开证书的扩展格式生成。

**1. 能用公开证书就用公开证书。** 任何 ACME CA 都能免费签发格式规范的证书，宝塔面板一键就能申请。

**2. 必须内部签发时**，用正规的 CA 结构，服务器证书带上这些扩展：

```bash
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr \
  -subj "/CN=example.com" -addext "subjectAltName=DNS:example.com,DNS:www.example.com"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 200 \
  -out server.crt -copy_extensions copy \
  -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=critical,digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth")
```

`-copy_extensions` 需要 OpenSSL 3.0 及以上。

**3. 检查结果。** 用 [证书解析](https://ssl.sh/zh/tools/certificate-decoder/) 查看新证书，和公开证书对比，再用 `curl ssl.sh/example.com` 复测。
