浏览器

ERR_SSL_UNRECOGNIZED_NAME_ALERT:服务器不认识这个域名

作者: · 最后核实

报错信息ERR_SSL_UNRECOGNIZED_NAME_ALERT

ERR_SSL_UNRECOGNIZED_NAME_ALERT 的意思是:服务器收到了你要访问的域名,回复说“我不提供这个域名的服务”。 连接在出示证书之前就被拒绝了,说明 DNS 解析和服务器配置对不上。

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

基本是网站的问题。用 SSL 检测 从外部测:

curl ssl.sh/example.com

检测也收到同样的告警,就是服务器或 CDN 上缺这个域名。访客这边要排除的是:域名拼错、hosts 文件里有旧条目(C:\Windows\System32\drivers\etc\hosts 或 /etc/hosts)、DNS 过滤软件把域名重定向了。

原因

最常见的原因是 DNS 指向了不托管这个网站的服务器;另外 4 种都是服务器不认识客户端发来的域名(SNI)。

1. DNS 指向的服务器不托管这个网站

迁移服务器之后,A 记录还指着旧服务器,旧服务器上已经没有这个站点。对比一下:

dig +short example.com
curl -sv --resolve example.com:443:203.0.113.10 https://example.com/ -o /dev/null 2>&1 | grep -i alert

在 DNSPod、阿里云解析里改完记录后,注意 TTL 没过期前部分用户还会解析到旧地址。

2. Nginx 默认站点开了 ssl_reject_handshake

Nginx 1.19.4 起,在兜底的 server 里写 ssl_reject_handshake on;,遇到不认识的 SNI 域名就会发这个告警。这本来是有意为之;要修的是给这个域名加上 server_name 正确的 server 块。

3. 缺虚拟主机或绑定

Apache 没有这个域名的 <VirtualHost *:443>;IIS 勾选了“需要服务器名称指示”却没给这个主机名建 HTTPS 绑定;HAProxy 开了 strict-sni 却没有这个域名的证书。宝塔面板里则是这个域名没加到任何站点的“域名管理”中。

4. CDN 或负载均衡上没有这个域名

DNS 已经 CNAME 到 CDN,但域名从没添加到 CDN 账户,或者已经被删除、被停用(比如欠费、备案失效)。节点会拒绝不认识的 SNI。

5. 客户端发送的域名和预期不同

浏览器里少见,但配置错误的代理可能改写或去掉 SNI。换个网络测一下。

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

Chrome、Firefox、curl 和 Java 客户端收到的是同一个 TLS 告警,只是显示的文字不同。

浏览器 显示内容
Chrome / Edge / 360 / QQ 浏览器 “此网站无法提供安全连接”,代码 ERR_SSL_UNRECOGNIZED_NAME_ALERT
Firefox “建立安全连接失败”,常见代码 SSL_ERROR_UNRECOGNIZED_NAME_ALERT
curl tlsv1 unrecognized name
Java 客户端 javax.net.ssl.SSLHandshakeException: Received fatal alert: unrecognized_name

站长怎么修

修法是让 DNS 指向的那台服务器或 CDN 认识这个域名:加上对应的站点配置和证书。

1. 确认 DNS 指向正确。 A/AAAA 或 CNAME 记录要指向实际托管网站的服务器或 CDN。

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;
}

server {
    listen 443 ssl default_server;
    ssl_reject_handshake on;
}

第二个 server 块继续拒绝不认识的域名,这是好做法,前提是所有真实域名都写进了第一个 server 块。

3. 在 CDN 或负载均衡上添加域名,并绑定对应证书。操作步骤见阿里云 CDN 配置 HTTPS和腾讯云 CDN 配置 HTTPS。

4. 复测。 运行 curl ssl.sh/example.com,每个别名也测一遍(比如 curl ssl.sh/www.example.com)。

常见问题

SNI 是什么,和这个错误有什么关系?

SNI(服务器名称指示)是浏览器在 TLS 握手一开始发送的域名,让一个 IP 可以承载多个 HTTPS 网站。服务器不认识这个名字,就可以用 unrecognized_name 终止握手,也就是这个错误。

带 www 能打开,不带 www 打不开,为什么?

服务器或 CDN 上只配了其中一个域名。把缺的域名加到虚拟主机(证书里也要有),或者在已配置的 server 块里做跳转。

hosts 文件会导致这个错误吗?

会。旧的 hosts 条目或 DNS 过滤软件可能把你引到一台早已不再托管这个网站的服务器。删掉覆盖条目,刷新 DNS 缓存(Windows 运行 ipconfig /flushdns)再试。

只有 Java 程序报 unrecognized_name,浏览器正常,怎么回事?

一些老版本 Apache 在找不到匹配的虚拟主机时,会发出“警告级别”的 unrecognized_name 告警,浏览器会忽略它,但部分 Java 客户端会把它当成致命错误。根本办法是给 Apache 配好 ServerName 和对应的虚拟主机;Java 端临时可以用 -Djsse.enableSNIExtension=false 关闭 SNI,但这会让多站点服务器返回错误的证书,不建议长期使用。

资料来源

  1. RFC 6066 第 3 节:Server Name Indication
  2. RFC 8446 第 6 节:Alert 协议
  3. nginx ngx_http_ssl_module: ssl_reject_handshake
  4. Chromium net_error_list.h