Сообщение об ошибке
javax.net.ssl.SSLHandshakeException: (unrecognized_name) Received fatal alert: unrecognized_name
Также выводится как
- Received fatal alert: unrecognized_name
JDK 25 сообщает «(unrecognized_name) Received fatal alert: unrecognized_name». Java 7 и ранние выпуски Java 8 прерывали подключение, даже если сервер отправлял это оповещение лишь как предупреждение. Классический пример — конфигурации Apache httpd без подходящего ServerName.
Java (JSSE) — TLS alert 112 from a server that does not serve the requested SNI name
Что это означает
JVM передала имя хоста из URL в расширении SNI, а сервер ответил критическим оповещением TLS 112 (unrecognized_name), потому что для этого имени на нём не настроен ни один сайт. Java считает это оповещение критическим и прекращает подключение. Сервер доступен, просто он не распознаёт имя, которое вы использовали.
Почему это происходит
На сервере нет сайта для этого имени
частоНовое DNS-имя (или CNAME на платформу или CDN) указывает на сервер, где это имя так и не добавили.
Клиент обращается по псевдониму, которого нет в списке имён сервера
частоВнутренние или устаревшие имена в конфигурации клиента, которых нет среди виртуальных хостов сервера.
Apache httpd без подходящего ServerName
иногдаApache отправляет unrecognized_name, если имя из SNI не совпадает ни с одним ServerName или ServerAlias виртуальных хостов с TLS.
Как исправить
- 1.
Выясните, какие имена принимает сервер
Попробуйте выполнить рукопожатие с возможными именами через openssl s_client -servername.
bash # Which SNI names does the server accept? for n in api.example.com www.example.com; do printf '%-18s ' "$n" echo | openssl s_client -connect api.example.com:443 -servername "$n" -brief 2>&1 | grep -m1 -E 'Protocol version|alert' || echo fail done - 2.
Добавьте имя на сервер
Настройте ServerName или ServerAlias (или аналогичную настройку в nginx, CDN или на платформе) вместе с сертификатом, который покрывает это имя.
text # Apache httpd: every name clients use must be a ServerName or ServerAlias of a TLS vhost <VirtualHost *:443> ServerName api.example.com ServerAlias api-legacy.example.com SSLEngine on </VirtualHost> - 3.
Подключайтесь по имени хоста, настроенному на сервере
Лучше исправить URL, чем глобально отключать SNI.
text Use the server's configured host name in the URL. Turning SNI off with -Djsse.enableSNIExtension=false only works if the server's default site is the one you need, and it breaks every server that relies on SNI; avoid it.