Назад | Перейти на главную страницу

Как я могу определить, использует ли сервер SNI для HTTPS?

Я ищу простой способ узнать, использует ли сервер расширение SSL для указания имени сервера для своего сертификата HTTPS на веб-сайте. Подойдет метод, использующий браузер или командную строку Unix.

Спасибо!

Один лайнер, который вы, вероятно, ищете для обнаружения наличия заголовка расширения SSL / TLS Server Name Indication:

openssl s_client -servername www.SERVERNAME.com -tlsextdebug -connect www.YOURSERVER.com:443 2>/dev/null | grep "server name"

где www.SERVERNAME.com это значение SNI, которое вы тестируете, и www.YOURSERVER.com - это доменное имя или IP-адрес тестируемого сервера с поддержкой TLS.

В командной строке используется opensslс s_client (видеть s_client (1)) для подключения к серверу по адресу www.YOURSERVER.com в порту 443. В -tlsextdebug опция включает вывод отладки расширения TLS. В -servername опция сообщает s_client программа пройти www.SERVERNAME.com в качестве значения поля SNI в пакете ClientHello во время подтверждения TLS.

В заключение, 2>/dev/null просто скрывает вывод stderr (который может быть шумным), а | grep "server name" конвейер фильтрует стандартный вывод для отображения расширения TLS под названием "имя сервера" в s_clientвывод отладки расширения TLS.

Если вы видите строку вывода, например

TLS server extension "server name" (id=0), len=0

тогда сервер возвращает информацию заголовка SNI в своем ответе ServerHello. Если вы этого не сделаете, то, возможно, сервер либо не поддерживает SNI, либо он не был настроен для возврата информации SNI с заданным вами именем. В этом случае еще раз проверьте, что вы используете доменное имя в -servername опция, о которой сервер должен ответить информацией о SNI.

SNI инициируется клиентом, поэтому вам нужен клиент, который его поддерживает. Если вы не используете Windows XP, подойдет ваш браузер. Если ваш клиент позволяет правильно отлаживать SSL-соединения (к сожалению, даже команды интерфейса командной строки gnutls / openssl этого не делают), вы можете увидеть, отправляет ли сервер обратно поле server_name в расширенном приветствии. Обратите внимание, что отсутствие этого поля означает только то, что сервер не использовал server_name в приветствии клиента, чтобы помочь выбрать сертификат, а не то, что он его не поддерживает.

Итак, на практике самый простой тест - просто попытаться подключиться. Для этого вам нужно знать два имени, которые разрешают один и тот же IP-адрес, к которому может быть выполнено ssl-соединение. https проще всего, так как вы можете просто просмотреть оба имени и посмотреть, представлен ли вам правильный сертификат.

Есть три исхода:

  • Вы получаете сертификат с подстановкой (или сертификат с subjectAltName), который охватывает оба имени: вы ничего не узнаете
  • Вы получили неправильный сертификат хотя бы для одного из них: либо сервер не поддерживает SNI, либо он был настроен неправильно
  • Вы получаете два разных сертификата, оба на правильное имя: SNI поддерживается и правильно настроен.

Немного более сложный тест, который даст больше информации, - это открыть wirehark и захватить его во время просмотра. Затем вы можете найти соответствующие пакеты, отфильтровав ssl.handshake. На приведенных ниже снимках экрана показан пример пары приветствия клиента / сервера, где поддерживается SNI:

Опять же, конечно, отсутствие поля server_name в приветствии сервера не означает, что SNI не поддерживается. Просто предоставленное клиентом server_name не использовалось при принятии решения, какой сертификат использовать.

Ты можешь использовать openssl для получения и запроса сертификата.

  • получить сертификат с openssl s_client -connect
  • проанализировать сертификат с помощью openssl x509
  • grep чтобы найти информацию "DNS:"

openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:

% openssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2
verify return:1
depth=1 C = BM, O = QuoVadis Limited, CN = QuoVadis Global SSL ICA G2
verify return:1
depth=0 C = CH, ST = Zuerich, L = Zuerich, O = Kaspar Brand, CN = alice.sni.velox.ch
verify return:1
                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch

В последней строке показаны все записи SNI, присутствующие в сертификате:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch