# SSL_ERROR_BAD_CERT_DOMAIN：Firefox 证书与域名不符怎么修

> Firefox 提示 SSL_ERROR_BAD_CERT_DOMAIN，说明证书里没有你访问的域名。修 SAN 列表、SNI 配置或 CDN 证书绑定即可。

Source: https://ssl.sh/zh/errors/ssl-error-bad-cert-domain/
Last updated: 2026-11-10

**SSL_ERROR_BAD_CERT_DOMAIN 的意思是：网站证书是签给另一个域名的，不包括你正在访问的这个。** 证书本身可能完全有效，只是覆盖不到这个名字。这类问题基本都在服务器端修。

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

外部检测的 SAN 列表里没有这个域名，是站长要修；外部检测正确而 Firefox 看到的证书不同，是网络在替网站应答。用 [SSL 检测](https://ssl.sh/zh/tools/ssl-checker/) 看证书里有哪些域名：

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

网络原因常见的是公共 Wi-Fi 认证页、DNS 过滤、hosts 文件条目，或者替别的网站应答的代理。另外检查一下是不是域名打错了、收藏夹里存的是早就停用的旧域名。

## 原因

下面 5 种原因归结为一点：证书的 SAN 列表没覆盖访问的域名，或者服务器返回了别的网站的证书。

### 1. 缺 www 或主域名

证书只覆盖 `example.com`，没覆盖 `www.example.com`，或者反过来。查看证书里的域名：

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

### 2. 通配符匹配不上

`*.example.com` 只覆盖一级，不匹配 `example.com`，也不匹配 `dev.api.example.com`。

### 3. 虚拟主机或 SNI 落到了默认站点

请求的域名没有匹配到任何 server 块，服务器就拿默认站点的证书应答，那是别的网站的证书。常见于先把域名解析到服务器、还没在 Web 服务里配置这个站的时候。宝塔面板里要在对应网站的“域名管理”里加上这个域名。

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

阿里云/腾讯云 CDN 的加速域名没开 HTTPS 或没绑证书，节点就返回通用证书。每个加速域名都要绑定能覆盖它的证书。

### 5. 用 IP 或内网短名访问

输入 `https://203.0.113.10` 或内网短域名，几乎不可能和证书匹配。用证书签发时的完整域名访问。

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

同一问题在 Chrome、Edge、360 和 QQ 浏览器里是 NET::ERR_CERT_COMMON_NAME_INVALID，curl 报 no alternative certificate subject name matches target host name。

| 浏览器 | 显示内容 |
|---|---|
| Firefox | “警告：面临潜在的安全风险”，说明该网站使用的证书对 example.com 无效 |
| Chrome / Edge / 360 / QQ 浏览器 | [NET::ERR_CERT_COMMON_NAME_INVALID](https://ssl.sh/zh/errors/net-err-cert-common-name-invalid/) |
| Safari | “此连接非私人连接” |
| curl | `no alternative certificate subject name matches target host name` |

## 站长怎么修

修法是让证书的 SAN 覆盖访客会用到的每个域名，并让每个域名落到正确的 server 块。

**1. 一张证书写全所有域名。** 访客会用到的每个域名都申请进去：

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

向商业 CA 申请需要 CSR 的话，[CSR 生成器](https://ssl.sh/zh/tools/csr-generator/) 会帮你把 SAN 写好。在阿里云、腾讯云申请免费单域名证书时，它通常只覆盖你填写的那一个域名（有的会附带 www），多个子域名要分别申请或改用多域名证书。

**2. 每个域名对应正确的 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;
}
```

**3. 改完逐个检查。** 分别运行 `curl ssl.sh/example.com` 和 `curl ssl.sh/www.example.com`，都通过后，用 301 跳转统一到你的首选域名。
