Jak mogę wykryć, czy serwer używa SNI dla HTTPS?

41

Szukam prostego sposobu, aby dowiedzieć się, czy serwer używa rozszerzenia SSL Server Name Indication do certyfikatu HTTPS na stronie internetowej. Metoda korzystająca z wiersza polecenia przeglądarki lub systemu Unix jest w porządku.

Dzięki!

spookylukey
źródło

Odpowiedzi:

20

SNI jest inicjowany przez klienta, więc potrzebujesz klienta, który go obsługuje. Jeśli nie masz Windows XP, Twoja przeglądarka zrobi to. Jeśli twój klient pozwala poprawnie debugować połączenia SSL (niestety, nawet polecenia CLI gnutls / openssl nie robią tego), możesz sprawdzić, czy serwer odsyła pole nazwa_serwera w rozszerzonym hello. Zauważ, że brak tego pola oznacza tylko, że serwer nie użył nazwy serwera w kliencie hello, aby pomóc wybrać certyfikat, a nie, że go nie obsługuje.

Tak więc w praktyce najłatwiejszym testem jest po prostu próba połączenia. W tym celu musisz znać dwie nazwy, które kończą się tym samym adresem IP, z którym można nawiązać połączenie ssl. https jest najłatwiejszy, ponieważ możesz po prostu przejrzeć obie nazwy i sprawdzić, czy masz odpowiedni certyfikat.

Istnieją trzy wyniki:

  • Otrzymasz certyfikat wieloznaczny (lub z podmiotemAltName), który obejmuje obie nazwy: niczego się nie uczysz
  • Otrzymujesz zły certyfikat dla co najmniej jednego z nich: albo serwer nie obsługuje SNI, albo został źle skonfigurowany
  • Otrzymujesz dwa różne certyfikaty, oba o poprawnej nazwie: SNI jest obsługiwany i poprawnie skonfigurowany.

Nieco bardziej skomplikowanym testem, który da więcej informacji, jest otwarcie i przechwytywanie wireshark podczas przeglądania. Następnie możesz znaleźć odpowiednie pakiety, filtrując ssl.handshake. Poniższe zrzuty ekranu są przykładem pary hello / server hello, w której obsługiwany jest SNI:

Witaj kliencie Witam serwer

Ponownie, oczywiście brak pola server_name na serwerze hello nie oznacza, że ​​SNI nie jest obsługiwany. Tylko to, że podana przez klienta nazwa_serwera nie była używana przy podejmowaniu decyzji, którego certyfikatu użyć.

Dennis Kaarsemaker
źródło
9
Dennis - nie zgadzam się openssl. Niektóre szczegóły są dostępne: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443Pewne wskazania do używania SNI podano podczas testu Qualys SSL .
Deer Hunter,
Ach, tęskniłem za tym na stronie podręcznika. Dzięki za dodanie.
Dennis Kaarsemaker,
26

Jedną linijką, której prawdopodobnie szukasz do wykrycia obecności nagłówka rozszerzenia Wskazanie nazwy serwera SSL / TLS, jest:

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

gdzie www.SERVERNAME.comjest testowana wartość SNI i www.YOURSERVER.comnazwa domeny lub adres IP testowanego serwera obsługującego TLS.

W wierszu poleceń używane openssljest polecenie s s_client(patrz s_client (1) ), aby połączyć się z serwerem www.YOURSERVER.comna porcie 443. W -tlsextdebugopcji można włączyć rozszerzenia TLS debugowania. Ta -servernameopcja informuje s_clientprogram, aby przekazał www.SERVERNAME.comjako wartość pola SNI w pakiecie ClientHello podczas uzgadniania TLS.

Wreszcie, 2>/dev/nullpo prostu ukrywa wyjście stderr (które może być głośne), a | grep "server name"potok filtruje standardowe wyjście, aby wyświetlić rozszerzenie TLS o nazwie „nazwa serwera” w s_clientwyjściu debugowania rozszerzenia TLS.

Jeśli widzisz wiersz wyniku, taki jak

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

następnie serwer zwraca informacje nagłówka SNI w odpowiedzi ServerHello. Jeśli tego nie zrobisz, możliwe, że serwer albo nie obsługuje SNI, albo nie został skonfigurowany do zwracania informacji SNI, biorąc pod uwagę żądaną nazwę. W takim przypadku sprawdź dwukrotnie, czy używasz nazwy domeny w -servernameopcji, o której serwer powinien odpowiedzieć z informacją SNI.

Meitar
źródło
1
Dane wyjściowe są takie same, niezależnie od tego, czy używam poprawnego, -servernameczy nie. -servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere= TLS server extension "server name" (id=0), len=0(I takie same dane wyjściowe, jeśli pasują.) Jak sprawdzić, czy dane wyjściowe nie są zgodne z hostem na serwerze?
bshea
1
@bshea Musisz przekazać -msgoprócz powyższych parametrów i grep dla „Alert”. Jeśli -servernamecoś jest nie tak, otrzymasz coś TLS 1.2 Alert ... warning unrecognized_namez serwera. @Meitar Myślę, że jeśli dodasz to do odpowiedzi, będą przydatne dla innych osób.
Viktor Nonov
@ ViktorNonov -msgPrzełącznik po prostu dodaje zrzut heksowy komunikatów protokołu TLS. Nie jest wymagane obserwowanie błędu uzgadniania TLS, więc dodanie odpowiedzi do tej odpowiedzi byłoby niepoprawne. Co więcej, takie błędy uzgadniania TLS są drukowane w STDOUT, co oznaczałoby, 2>/dev/nullże trzeba by je usunąć z odpowiedzi, aby mogła zostać przetworzona grepw pierwszej kolejności. W rzeczywistości @bshea pyta: „Jak wykryć błędy TLS?” które jest zupełnie innym pytaniem niż pytanie „Czy ten serwer wykorzystuje funkcję SNI protokołu TLS?” który jest tutaj tematem.
Meitar
@ Meeitar, nie mogłem znaleźć innego sposobu na obserwowanie komunikatów uzgadniania TLS. Nawet jeśli przekieruję STDERRdo pliku tekstowego, nie dostaję tego błędu. Bez -msgnie mogłem znaleźć innej opcji, która pokazuje wiadomości uścisku dłoni. (przy użyciu openssl 1.0.2q). Tak długo, jak istotna jest odpowiedź, możesz mieć rację.
Viktor Nonov
-2

Możesz użyć openssldo pobrania i zapytania certyfikatu.

  • pobierz certyfikat za pomocą openssl s_client -connect
  • parsuj certyfikat za pomocą openssl x509
  • grep znaleźć informacje „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

Ostatni wiersz pokazuje wszystkie wpisy SNI obecne w certyfikacie:

                DNS:alice.sni.velox.ch, DNS:carol.sni.velox.ch
spazm
źródło
Czego szukam w tym wyjściu? Fakt, że istnieje wiele domen?
spookylukey
Te DNS:... wpisy na ostatniej linii pokazać wszystkich prawidłowych nazw SNI w certyfikacie.
spazm
4
Sieci SAN w certyfikacie i obsługa SNI na serwerze to różne rzeczy, użycie sieci SAN do wirtualnego hostingu HTTPS jest czymś w rodzaju hacka, który wyprzedza SNI. W przypadku SNI nie potrzebujesz certyfikatu z sieciami SAN, ponieważ serwer może wybrać indywidualny certyfikat, który odpowiada oczekiwaniom klientów.
mr. Spuratic