Я ищу простой способ узнать, использует ли сервер расширение 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 проще всего, так как вы можете просто просмотреть оба имени и посмотреть, представлен ли вам правильный сертификат.
Есть три исхода:
Немного более сложный тест, который даст больше информации, - это открыть 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