Сообщение об ошибке
SSL routines:ssl3_read_bytes:tlsv1 unrecognized name
Также выводится как
- error:0A000458:SSL routines::tlsv1 unrecognized name
- SSL alert number 112
OpenSSL 3.x выводит «error:0A000458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:…:SSL alert number 112». В Java-клиентах то же оповещение выглядит как «javax.net.ssl.SSLHandshakeException: Received fatal alert: unrecognized_name».
OpenSSL (client side) — TLS alert 112 (unrecognized_name) sent by a server that does not serve the requested SNI name
Что это означает
Клиент отправил имя сервера (SNI), которое сервер не обслуживает, и сервер ответил критическим оповещением TLS 112 (unrecognized_name). RFC 6066 разрешает серверам отправлять это оповещение как предупреждение или как критическое; строгие серверы (и некоторые специализированные устройства) считают неизвестное имя критической ошибкой, поэтому рукопожатие обрывается ещё до того, как показан какой-либо сертификат.
Почему это происходит
Для этого имени на сервере нет конфигурации
частоНовое имя хоста, направленное на существующий сервер, переименованный сервис или CNAME на CDN либо платформу, где собственный домен так и не добавили.
Клиент отправляет не то имя, которое предполагалось
частоКлиенты, которые подключаются через внутренний псевдоним или имя балансировщика нагрузки, отправляют в SNI этот псевдоним, а сервер знает только публичное имя.
Нет SNI или вместо имени указан адрес
иногдаНекоторые клиенты при подключении по IP-адресу не отправляют SNI; серверы, которые по настройкам требуют известное имя, отказывают таким клиентам.
Как исправить
- 1.
Выясните, какие имена принимает сервер
Попробуйте выполнить рукопожатие с каждым именем-кандидатом: имена, с которыми оно проходит, настроены на сервере.
bash # Which names does the server accept? for n in example.com www.example.com api.example.com; do printf '%-20s ' "$n" echo | openssl s_client -connect 203.0.113.10:443 -servername "$n" -brief 2>&1 | grep -m1 -E 'Protocol version|error' || echo fail done - 2.
Настройте недостающее имя на сервере
Добавьте имя в блок server (или в список доменов CDN или платформы) вместе с сертификатом, который его покрывает.
text # nginx: a server block (and certificate) for every name clients use server { listen 443 ssl; server_name api.example.com legacy-api.example.com; ssl_certificate /etc/nginx/tls/api.fullchain.pem; ssl_certificate_key /etc/nginx/tls/api.key; } - 3.
Сделайте так, чтобы клиент отправлял правильное имя
Оставьте в URL настоящее имя хоста и переопределите только адрес (curl --resolve, параметры servername в библиотеках).
bash # Send the server's real name as SNI when connecting by address curl --resolve api.example.com:443:203.0.113.10 https://api.example.com/ openssl s_client -connect 203.0.113.10:443 -servername api.example.com </dev/null