# NET::ERR_CERT_COMMON_NAME_INVALID：证书域名不匹配怎么办

> NET::ERR_CERT_COMMON_NAME_INVALID 表示证书里没有你访问的域名。常见是缺 www、子域名没签进去或 SNI 配错。

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

**NET::ERR_CERT_COMMON_NAME_INVALID 的意思是：证书本身没问题，但它是签给别的域名的，不包含你正在访问的这个。** 几乎都是网站配置问题：少签了 `www`、子域名没加进证书，或者服务器返回了另一个网站的证书。

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

这个错误很少是访客造成的。用 [SSL 检测](https://ssl.sh/zh/tools/ssl-checker/) 确认：

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

检测结果会列出证书里的所有域名。你访问的域名不在里面，就需要网站方修。访客这边可能的原因只有几个：域名打错或收藏夹里是旧地址；hosts 文件、DNS 过滤软件把你指到了别的服务器；公共 Wi-Fi 认证页对所有域名都返回它自己的证书（见 [公共 Wi-Fi 认证页报错](https://ssl.sh/zh/errors/captive-portal-ssl-error/)）。

## 原因

所有原因的结果都是证书的 SAN 里没有你访问的域名，最常见的是 www 和主域名没有同时签。

### 1. www 和主域名没有同时签

证书里只有 `example.com`，访客输的是 `www.example.com`，或者反过来。查看 SAN 列表：

```bash
echo | openssl s_client -connect example.com:443 -servername www.example.com 2>/dev/null \
  | openssl x509 -noout -ext subjectAltName
```

修法：重新签发，两个都写上，比如 `certbot -d example.com -d www.example.com`。

### 2. 通配符层级不对或缺主域名

`*.example.com` 不匹配 `example.com`，也不匹配 `api.bj.example.com`。把缺的域名单独加上，或者给更深一级再申请一个通配符。

### 3. 返回了错误的虚拟主机（SNI）

一台服务器放多个站时，请求的域名没有匹配到任何 `server` 块，Nginx 就用 `default_server`（或第一个 `server`）的证书。新加的子域名没写 `server_name`，就会拿到别的站的证书。宝塔面板里新增子域名要在“网站 → 设置 → 域名管理”里加上，再重新申请证书。

### 4. CDN 或负载均衡没有这个域名的证书

在阿里云/腾讯云 CDN 加了加速域名，却没给它配 HTTPS 证书，节点就返回默认证书。每个加速域名都要单独绑定证书。

### 5. 证书只有 CN，没有 SAN

老脚本生成的自签名证书可能完全没有 SAN，不管 CN 写什么，Chrome 都会拒绝。

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

各浏览器的报错代码不同，原因相同：证书里没有地址栏里的域名。

| 浏览器 | 显示内容 |
|---|---|
| Chrome / Edge / 360 极速模式 | “您的连接不是私密连接”，代码 `NET::ERR_CERT_COMMON_NAME_INVALID`，并说明证书来自另一个域名 |
| Firefox | [SSL_ERROR_BAD_CERT_DOMAIN](https://ssl.sh/zh/errors/ssl-error-bad-cert-domain/) |
| Safari | “此连接非私人连接”，详情里能看到证书实际签给的域名 |
| IE / 360 兼容模式 | “此网站的安全证书有问题。”，见 [DLG_FLAGS_SEC_CERT_CN_INVALID](https://ssl.sh/zh/errors/dlg-flags-sec-cert-cn-invalid/) |
| curl | `SSL: no alternative certificate subject name matches target host name` |

## 站长怎么修

让证书的 SAN 覆盖每一个对外的域名，再给每个域名配好对应的 server 块。

**1. 先看证书覆盖了哪些域名。** [SSL 检测](https://ssl.sh/zh/tools/ssl-checker/) 和 `curl ssl.sh/example.com` 会列出 SAN，以及每个域名实际拿到的是哪张证书。

**2. 把所有域名都签进去。** certbot：

```bash
sudo certbot certonly --nginx -d example.com -d www.example.com -d shop.example.com
```

通配符要用 DNS 验证，比如域名在 DNSPod：`acme.sh --issue --dns dns_dp -d example.com -d '*.example.com'`；在阿里云解析用 `dns_ali`。

**3. 每个域名都要有对应的 server 块。**

```nginx
server {
    listen 443 ssl;
    server_name example.com www.example.com;
    ssl_certificate     /etc/nginx/ssl/example.com.fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
}
```

**4. 统一主域名。** 两个域名都覆盖之后，用 301 把一个跳转到另一个，外链和收藏都集中到同一个地址，对搜索引擎也更友好。
