Я шукаю простий спосіб дізнатися, чи сервер використовує розширення SSL-вказівника Імені сервера для свого сертифіката HTTPS на веб-сайті. Метод, який використовує або браузер, або командний рядок Unix, чудово.
Дякую!
Я шукаю простий спосіб дізнатися, чи сервер використовує розширення SSL-вказівника Імені сервера для свого сертифіката HTTPS на веб-сайті. Метод, який використовує або браузер, або командний рядок Unix, чудово.
Дякую!
Відповіді:
SNI ініціюється клієнтом, тому вам потрібен клієнт, який його підтримує. Якщо ви не на Windows XP, ваш браузер зробить. Якщо ваш клієнт дозволяє належним чином налагоджувати з’єднання SSL (на жаль, навіть CLI команди gnutls / openssl цього не роблять), ви можете побачити, чи сервер повертає назад поле ім’я сервера у розширеному привіт. Зауважте, що відсутність цього поля означає лише те, що сервер не використовував ім'я сервера у привітному клієнті для вибору сертифіката, а не того, що він не підтримує його.
Тож на практиці найпростіший тест - це просто спробувати підключення. Для цього вам потрібно знати два імена, які відповідають одному і тому ж IP-адресу, до якого можна встановити з'єднання ssl. https - це найпростіше, оскільки ви можете просто перейти до обох імен і побачити, чи отримали ви правильний сертифікат.
Є три результати:
Трохи складніший тест, який дасть більше інформації, - це відкрити проводку і захопити під час перегляду. Потім ви можете знайти відповідні пакети, відфільтрувавши для ssl.handshake. Наведені нижче скріншоти є прикладом привітної пари клієнта привіт / сервер, де підтримується SNI:
Знову ж таки, звичайно, відсутність поля імені сервера в привіт сервері не вказує на те, що SNI не підтримується. Просто те, що надане клієнтом ім’я_сервера не було використано для вирішення, який сертифікат використовувати.
Один вкладиш, який ви, ймовірно, шукаєте, щоб виявити наявність заголовка розширення вказівника розширення імені SSL / TLS:
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 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"
конвеєр фільтрує stdout, щоб відобразити розширення TLS під назвою "ім'я сервера" у s_client
виводі налагодження розширення TLS.
Якщо ви бачите рядок виводу, такий як
TLS server extension "server name" (id=0), len=0
тоді сервер повертає інформацію заголовка SNI у своїй відповіді ServerHello. Якщо цього немає, то можливо сервер або не підтримує SNI, або він не налаштований повертати інформацію про SNI з урахуванням імені, яке ви запитуєте. У цьому випадку двічі перевірте, чи використовуєте ви доменне ім’я в -servername
опції, про яку сервер повинен відповідати інформацією про SNI.
-servername
чи ні. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere
= TLS server extension "server name" (id=0), len=0
(І такий же вихід, якщо вони збігаються.) Як ви переконаєтесь, що він не відповідає хосту на сервері з виводу?
-msg
додатково параметри вище та простукувати "Alert". Якщо -servername
помилка неправильна, ви отримаєте щось на зразок TLS 1.2 Alert ... warning unrecognized_name
сервера. @Meitar Я думаю, якщо ви додасте, що відповідь буде корисна для інших людей.
-msg
Перемикач просто додає шістнадцятковий пакет повідомлень протоколу TLS. Не потрібно дотримуватися помилки рукостискання TLS, тому було б неправильно додати до цієї відповіді. Більше того, помилки рукостискання TLS, подібні цій, надруковані в STDOUT, що означатиме, що 2>/dev/null
потрібно буде видалити з відповіді, щоб grep
в першу чергу її обробити . Що насправді @bshea просить: "Як я можу виявити помилки TLS?" що зовсім інше питання до питання "Чи використовує цей сервер функцію SNI протоколу TLS?" яка тут тема.
STDERR
текстовий файл, я не отримую цієї помилки там. Без цього -msg
я не зміг знайти інший варіант, який показує повідомлення рукостискання. (використовуючи openssl 1.0.2q). До тих пір, поки відповідність відповіді ви можете бути правильною.
Ви можете використовувати 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
DNS:...
запису на останньому рядку показати всі дійсні імена SNI в сертифікаті.
openssl
. Доступні деякі деталі:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
Деякі вказівки на використання SNI наведено під час тесту SSL Qualys .