Як я можу виявити, чи сервер використовує SNI для HTTPS?


41

Я шукаю простий спосіб дізнатися, чи сервер використовує розширення SSL-вказівника Імені сервера для свого сертифіката HTTPS на веб-сайті. Метод, який використовує або браузер, або командний рядок Unix, чудово.

Дякую!

Відповіді:


20

SNI ініціюється клієнтом, тому вам потрібен клієнт, який його підтримує. Якщо ви не на Windows XP, ваш браузер зробить. Якщо ваш клієнт дозволяє належним чином налагоджувати з’єднання SSL (на жаль, навіть CLI команди gnutls / openssl цього не роблять), ви можете побачити, чи сервер повертає назад поле ім’я сервера у розширеному привіт. Зауважте, що відсутність цього поля означає лише те, що сервер не використовував ім'я сервера у привітному клієнті для вибору сертифіката, а не того, що він не підтримує його.

Тож на практиці найпростіший тест - це просто спробувати підключення. Для цього вам потрібно знати два імена, які відповідають одному і тому ж IP-адресу, до якого можна встановити з'єднання ssl. https - це найпростіше, оскільки ви можете просто перейти до обох імен і побачити, чи отримали ви правильний сертифікат.

Є три результати:

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

Трохи складніший тест, який дасть більше інформації, - це відкрити проводку і захопити під час перегляду. Потім ви можете знайти відповідні пакети, відфільтрувавши для ssl.handshake. Наведені нижче скріншоти є прикладом привітної пари клієнта привіт / сервер, де підтримується SNI:

Клієнт привіт Привіт сервера

Знову ж таки, звичайно, відсутність поля імені сервера в привіт сервері не вказує на те, що SNI не підтримується. Просто те, що надане клієнтом ім’я_сервера не було використано для вирішення, який сертифікат використовувати.


9
Денніс - не згоден на openssl. Доступні деякі деталі: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443Деякі вказівки на використання SNI наведено під час тесту SSL Qualys .
Мисливець на олень

Ах, я пропустив це на сторінці. Дякую за доповнення
Денніс Каарсемейкер

26

Один вкладиш, який ви, ймовірно, шукаєте, щоб виявити наявність заголовка розширення вказівника розширення імені 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.


1
Вихід є однаковим, чи я використовую правильно -servernameчи ні. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(І такий же вихід, якщо вони збігаються.) Як ви переконаєтесь, що він не відповідає хосту на сервері з виводу?
bshea

1
@bshea Вам потрібно пройти -msgдодатково параметри вище та простукувати "Alert". Якщо -servernameпомилка неправильна, ви отримаєте щось на зразок TLS 1.2 Alert ... warning unrecognized_nameсервера. @Meitar Я думаю, якщо ви додасте, що відповідь буде корисна для інших людей.
Віктор Нонов

@ViktorNonov -msgПеремикач просто додає шістнадцятковий пакет повідомлень протоколу TLS. Не потрібно дотримуватися помилки рукостискання TLS, тому було б неправильно додати до цієї відповіді. Більше того, помилки рукостискання TLS, подібні цій, надруковані в STDOUT, що означатиме, що 2>/dev/nullпотрібно буде видалити з відповіді, щоб grepв першу чергу її обробити . Що насправді @bshea просить: "Як я можу виявити помилки TLS?" що зовсім інше питання до питання "Чи використовує цей сервер функцію SNI протоколу TLS?" яка тут тема.
Мейтар

@Meitar, я не міг знайти іншого способу спостерігати за повідомленнями рукостискання TLS. Крім того, навіть якщо я переспрямовую STDERRтекстовий файл, я не отримую цієї помилки там. Без цього -msgя не зміг знайти інший варіант, який показує повідомлення рукостискання. (використовуючи openssl 1.0.2q). До тих пір, поки відповідність відповіді ви можете бути правильною.
Віктор Нонов

-2

Ви можете використовувати 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

Що я шукаю в цьому висновку? Те, що існує декілька доменів?
spookylukey

У DNS:... запису на останньому рядку показати всі дійсні імена SNI в сертифікаті.
спазм

4
SAN в сертифікаті та підтримка SNI на сервері - це різні речі, використання SAN для віртуального хостингу HTTPS - це щось злому, що передує SNI. Для SNI вам не потрібен сертифікат з SAN, оскільки сервер здатний вибрати індивідуальний сертифікат, який відповідає клієнтам, що називають очікування.
mr.spuratic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.