fragen stichworte

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

Ich suche nach einer einfachen Methode, um zu erfahren, ob ein Server die SSL-Erweiterung für Servernamenanzeige für sein HTTPS-Zertifikat auf einer Website verwendet. Eine Methode, die entweder einen Browser oder eine Unix-Befehlszeile verwendet, ist in Ordnung.

Danke!

antworten

SNI wird vom Client initiiert, Sie benötigen also 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 beim Browsen geöffnet und gefangen wird. Sie können dann die relevanten Pakete finden, indem Sie nach ssl.handshake filtern. Die folgenden Screenshots sind ein Beispiel für ein Hello/Client-Hallo-Paar, bei dem SNI unterstützt wird:

Client hello Server hello

Natürlich gibt 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.

Derjenige Liner, den Sie wahrscheinlich suchen, um das Vorhandensein eines SSL/TLS Server Name Indication-Erweiterungs-Headers zu ermitteln, lautet:

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

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

Die Befehlszeile verwendet openssl s_client (siehe s_client (1)), um eine Verbindung zum Server unter www.YOURSERVER.com an Port 443 herzustellen. Die Option -tlsextdebug aktiviert die Debugging-Ausgabe der TLS-Erweiterung. Die Option -servername weist das Programm s_client an, www.SERVERNAME.com als Wert des SNI-Felds im ClientHello-Paket während des TLS-Handshakes zu übergeben.

Zum Schluss blendet 2>/dev/null einfach die stderr-Ausgabe aus (was sehr laut sein kann), und die | grep "server name" -Pipeline filtert stdout, um die TLS-Erweiterung mit dem Namen "Servername" in der TLS-Erweiterungs-Debugging-Ausgabe von s_client anzuzeigen.

Wenn Sie eine Ausgabezeile wie

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

Der Server sendet dann SNI-Header-Informationen in seiner ServerHello-Antwort. Ist dies nicht der Fall, ist es möglich, dass der Server SNI entweder nicht unterstützt oder der Server nicht so konfiguriert ist, dass er die SNI-Informationen mit dem gewünschten Namen zurückgibt. Überprüfen Sie in diesem Fall erneut, ob Sie einen Domänennamen in der Option -servername verwenden, auf die der Server mit SNI-Informationen antworten soll.