Frage Wie kann ich feststellen, ob ein Server SNI für HTTPS verwendet?


Ich bin auf der Suche nach einer einfachen Möglichkeit zu wissen, ob ein Server die Server Name Indication SSL-Erweiterung für sein HTTPS-Zertifikat auf einer Website verwendet. Eine Methode, die entweder einen Browser oder eine Unix-Befehlszeile verwendet, ist in Ordnung.

Vielen Dank!


35
2018-05-08 21:04


Ursprung




Antworten:


SNI wird vom Client initiiert, daher benötigen Sie einen Client, der es unterstützt. Sofern Sie nicht Windows XP verwenden, wird Ihr Browser es tun. Wenn Ihr Client SSL-Verbindungen ordnungsgemäß debuggen kann (leider nicht einmal die CLI-Befehle gnutls / openssl), können Sie sehen, ob der Server ein Feld server_name im erweiterten Hallo zurücksendet. Beachten Sie, dass das Fehlen dieses Felds nur bedeutet, dass der Server den Servernamen im Client hallo nicht verwendet hat, um bei der Auswahl eines Zertifikats zu helfen, und nicht, dass es dies nicht unterstützt.

In der Praxis besteht der einfachste Test darin, einfach die Verbindung herzustellen. Dazu müssen Sie zwei Namen kennen, die zu derselben IP-Adresse aufgelöst werden, zu der eine SSL-Verbindung hergestellt werden kann. https ist am einfachsten, da Sie dann einfach zu beiden Namen navigieren und sehen können, ob Ihnen das richtige Zertifikat vorliegt.

Es gibt drei Ergebnisse:

  • Sie erhalten ein Wildcard-Zertifikat (oder eines mit einem subjectAltName), das beide Namen abdeckt: Sie lernen nichts
  • Sie erhalten für mindestens eines von ihnen das falsche Zertifikat: entweder der Server unterstützt SNI nicht oder es wurde falsch konfiguriert
  • Sie erhalten zwei verschiedene Zertifikate, beide für den richtigen Namen: SNI wird unterstützt und korrekt konfiguriert.

Ein etwas komplizierterer Test, der mehr Informationen liefert, ist, dass der WireShark geöffnet ist und während des Browsens erfasst wird. Sie können dann die relevanten Pakete finden, indem Sie nach ssl.handshake filtern. Die folgenden Screenshots zeigen ein Beispiel für ein Hello / Client-Hallo-Paar, bei dem SNI unterstützt wird:

Client hello Server hello

Natürlich zeigt das Fehlen eines Feldes server_name im Server hallo nicht an, dass SNI nicht unterstützt wird. Lediglich, dass der vom Client bereitgestellte Servername nicht verwendet wurde, um zu entscheiden, welches Zertifikat verwendet werden soll.


19
2018-05-09 09:37



Dennis - stimme nicht zu openssl. Einige Details sind verfügbar: openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443 Einige Hinweise zur Verwendung von SNI werden während der Qualys gegeben SSL-Test. - Deer Hunter
Ah, das habe ich in der Manpage verpasst. Danke für die Zugabe. - Dennis Kaarsemaker


Der eine Liner, nach dem Sie wahrscheinlich suchen, um das Vorhandensein eines SSL / TLS Server Name Indication Erweiterungsheaders zu erkennen, ist:

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

woher www.SERVERNAME.com ist der SNI-Wert, den Sie testen und www.YOURSERVER.com ist der Domänenname oder die IP-Adresse des TLS-fähigen Servers, den Sie testen.

Die Befehlszeile verwendet opensslist es s_client (sehen s_client (1)) um eine Verbindung zum Server herzustellen www.YOURSERVER.com am Hafen 443. Das -tlsextdebug Option schaltet die Debug-Ausgabe der TLS-Erweiterung ein. Das -servername Option sagt die s_client Programm zu bestehen www.SERVERNAME.com als Wert des SNI-Feldes im ClientHello-Paket während des TLS-Handshakes.

Endlich, 2>/dev/null verbirgt einfach stderr Ausgang (der laut sein kann), und die | grep "server name" pipeline filtert stdout, um die TLS-Erweiterung namens "server name" in anzuzeigen s_clientDebugging-Ausgabe der TLS-Erweiterung.

Wenn Sie eine Ausgabezeile wie z

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

dann gibt der Server SNI-Kopfzeileninformationen in seiner ServerHello-Antwort zurück. Wenn Sie dies nicht tun, ist es möglich, dass der Server SNI entweder nicht unterstützt oder dass er nicht so konfiguriert wurde, dass er SNI-Informationen mit dem von Ihnen gewünschten Namen zurückgibt. Überprüfen Sie in diesem Fall, ob Sie einen Domänennamen in der Datenbank verwenden -servernameOption, auf die der Server mit SNI-Informationen antworten soll.


18
2018-06-01 20:34





Sie können verwenden openssl das Zertifikat abrufen und abfragen.

  • Holen Sie das Zertifikat mit openssl s_client -connect
  • parse das Cert mit openssl x509
  • grep um die "DNS:" Info zu finden

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

Die letzte Zeile zeigt alle im Zertifikat enthaltenen SNI-Einträge:

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

-3
2018-05-15 17:52



Was suche ich in dieser Ausgabe? Die Tatsache, dass mehrere Domains vorhanden sind? - spookylukey
Das DNS:...  Einträge in der letzten Zeile zeigen alle gültigen SNI-Namen im Zertifikat an. - spazm
SANs in einem Zertifikat und SNI-Unterstützung auf einem Server sind verschiedene Dinge, die Verwendung von SANs für HTTPS-Virtualhosting ist etwas von Hack, der SNI vorausgeht. Für SNI benötigen Sie kein Zertifikat mit SANs, da der Server ein einzelnes Zertifikat auswählen kann, das den Erwartungen des Clients entspricht. - mr.spuratic