浏览器
NET::ERR_CERT_COMMON_NAME_INVALID:证书域名不匹配怎么办
NET::ERR_CERT_COMMON_NAME_INVALIDNET::ERR_CERT_COMMON_NAME_INVALID 的意思是:证书本身没问题,但它是签给别的域名的,不包含你正在访问的这个。 几乎都是网站配置问题:少签了 www、子域名没加进证书,或者服务器返回了另一个网站的证书。
先判断是网站的问题还是你电脑的问题
这个错误很少是访客造成的。用 SSL 检测 确认:
curl ssl.sh/example.com
检测结果会列出证书里的所有域名。你访问的域名不在里面,就需要网站方修。访客这边可能的原因只有几个:域名打错或收藏夹里是旧地址;hosts 文件、DNS 过滤软件把你指到了别的服务器;公共 Wi-Fi 认证页对所有域名都返回它自己的证书(见 公共 Wi-Fi 认证页报错)。
原因
所有原因的结果都是证书的 SAN 里没有你访问的域名,最常见的是 www 和主域名没有同时签。
1. www 和主域名没有同时签
证书里只有 example.com,访客输的是 www.example.com,或者反过来。查看 SAN 列表:
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 |
| Safari | “此连接非私人连接”,详情里能看到证书实际签给的域名 |
| IE / 360 兼容模式 | “此网站的安全证书有问题。”,见 DLG_FLAGS_SEC_CERT_CN_INVALID |
| curl | SSL: no alternative certificate subject name matches target host name |
站长怎么修
让证书的 SAN 覆盖每一个对外的域名,再给每个域名配好对应的 server 块。
1. 先看证书覆盖了哪些域名。 SSL 检测 和 curl ssl.sh/example.com 会列出 SAN,以及每个域名实际拿到的是哪张证书。
2. 把所有域名都签进去。 certbot:
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 块。
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 把一个跳转到另一个,外链和收藏都集中到同一个地址,对搜索引擎也更友好。
常见问题
证书的 CN 明明写对了,Chrome 为什么还报错?
Chrome 只检查 SAN 扩展。CN 对、SAN 里没有这个域名,一样会失败。公开 CA 签的证书一定带 SAN,所以这个问题主要出在自己用 OpenSSL 生成的证书或内部证书上,重新生成时加上 -addext "subjectAltName=DNS:example.com"。
通配符证书能用在主域名上吗?
不能。*.example.com 只匹配一级,能覆盖 www.example.com、shop.example.com,覆盖不了 example.com 和 a.b.example.com。申请时把 example.com 和 *.example.com 一起写进同一张证书。阿里云、腾讯云申请通配符证书时也要注意这一点。
我直接用 IP 访问网站就出现这个错误,为什么?
证书一般是签给域名的,不是签给 IP 的。访问 https://203.0.113.10 时,除非证书里有这个 IP 的 SAN,否则一定报错。请用域名访问。