浏览器
ERR_SSL_UNRECOGNIZED_NAME_ALERT:服务器不认识这个域名
ERR_SSL_UNRECOGNIZED_NAME_ALERTERR_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,但这会让多站点服务器返回错误的证书,不建议长期使用。