浏览器

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

作者: · 最后核实

报错信息SSL_ERROR_BAD_CERT_DOMAIN

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

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

外部检测的 SAN 列表里没有这个域名,是站长要修;外部检测正确而 Firefox 看到的证书不同,是网络在替网站应答。用 SSL 检测 看证书里有哪些域名:

curl ssl.sh/example.com

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

原因

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

1. 缺 www 或主域名

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

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
Safari “此连接非私人连接”
curl no alternative certificate subject name matches target host name

站长怎么修

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

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

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

向商业 CA 申请需要 CSR 的话,CSR 生成器 会帮你把 SAN 写好。在阿里云、腾讯云申请免费单域名证书时,它通常只覆盖你填写的那一个域名(有的会附带 www),多个子域名要分别申请或改用多域名证书。

2. 每个域名对应正确的 server 块。

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 跳转统一到你的首选域名。

常见问题

SSL_ERROR_BAD_CERT_DOMAIN 能加例外吗?

只要网站没开 HSTS,Firefox 允许加例外。但只有在用 IP 或内网名访问你自己的设备时才说得过去。公开网站出现域名不符,可能说明你连到的不是那台服务器。

为什么只有在酒店、机场、高铁 Wi-Fi 上才出现?

这些网络的认证页会截住你的请求,用它自己的证书应答。先完成 Wi-Fi 登录认证,见 公共 Wi-Fi 认证页报错。

example.com 的证书能用在 www.example.com 上吗?

只有 SAN 里同时列了 www.example.com 才行。很多商业 CA 下单时会自动送 www,但 ACME 客户端只签你明确写出来的域名。

网站刚接入 CDN 就出现这个错误,哪里变了?

访客现在连的是 CDN 节点而不是你的源站,节点出示的是 CDN 账户里给这个加速域名绑定的证书。没签发也没上传的话,节点会拿一张别的域名的默认证书来应答。在阿里云/腾讯云 CDN 控制台给每个加速域名绑定能覆盖它的证书,再用 curl ssl.sh/example.com 确认节点发出的证书是对的,而不只是源站。

资料来源

  1. Mozilla Support: Error codes on secure websites
  2. RFC 9525: Service Identity in TLS
  3. RFC 6066 第 3 节:Server Name Indication