Перейти к содержимому
ecdsa.com
OpenSSL (client side)OpenSSL CLI

Сообщение об ошибке

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 разрешает серверам отправлять это оповещение как предупреждение или как критическое; строгие серверы (и некоторые специализированные устройства) считают неизвестное имя критической ошибкой, поэтому рукопожатие обрывается ещё до того, как показан какой-либо сертификат.

Почему это происходит

Как исправить

  1. 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. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей