50 votes

Comment puis-je détecter si un serveur utilise SNI pour HTTPS ?

Je cherche un moyen simple de savoir si un serveur utilise l'extension SSL Server Name Indication pour son certificat HTTPS sur un site web. Une méthode qui utilise soit un navigateur, soit une ligne de commande Unix est acceptable.

Merci de votre attention !

41voto

reuscam Points 887

La ligne que vous recherchez probablement pour détecter la présence d'un en-tête d'extension SSL/TLS Server Name Indication est la suivante :

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

donde www.SERVERNAME.com est la valeur SNI que vous testez et www.YOURSERVER.com est le nom de domaine ou l'adresse IP du serveur TLS que vous testez.

La ligne de commande utilise openssl 's s_client (voir s_client(1) ) pour se connecter au serveur à l'adresse www.YOURSERVER.com sur le port 443 . Les -tlsextdebug active la sortie de débogage de l'extension TLS. L'option -servername indique à l'option s_client programme à passer www.SERVERNAME.com comme la valeur du champ SNI dans le paquet ClientHello pendant la poignée de main TLS.

Enfin, 2>/dev/null cache simplement la sortie stderr (qui peut être bruyante), et l'option | grep "server name" Le pipeline filtre stdout pour afficher l'extension TLS appelée "nom du serveur" en s_client La sortie de débogage de l'extension TLS.

Si vous voyez une ligne de sortie telle que

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

le serveur renvoie des informations d'en-tête SNI dans sa réponse ServerHello. Dans le cas contraire, il est possible que le serveur ne prenne pas en charge les informations SNI ou qu'il n'ait pas été configuré pour renvoyer des informations SNI sous le nom que vous demandez. Dans ce cas, vérifiez que vous utilisez bien un nom de domaine dans l'en-tête -servername option pour laquelle le serveur doit répondre avec des informations SNI.

26voto

jowi Points 111

Le SNI est initié par le client, il faut donc un client qui le supporte. À moins que vous ne soyez sous Windows XP, votre navigateur fera l'affaire. Si votre client vous permet de déboguer correctement les connexions SSL (malheureusement, même les commandes CLI de gnutls/openssl ne le font pas), vous pouvez voir si le serveur renvoie un champ server_name dans le bonjour étendu. Notez que l'absence de ce champ signifie seulement que le serveur n'a pas utilisé le nom du serveur dans le message d'accueil du client pour choisir un certificat, et non pas qu'il ne le supporte pas.

En pratique, le test le plus simple consiste donc à essayer de se connecter. Pour ce faire, vous devez connaître deux noms qui se rapportent à la même adresse IP et auxquels une connexion SSL peut être établie. Le protocole https est le plus simple, car il vous suffit de naviguer vers les deux noms pour voir si le certificat correct s'affiche.

Il y a trois résultats :

  • Vous obtenez un certificat de type "wildcard" (ou un certificat avec un subjectAltName) qui couvre les deux noms : vous n'apprenez rien.
  • Vous obtenez le mauvais certificat pour au moins l'un d'entre eux : soit le serveur ne supporte pas le SNI, soit il a été mal configuré.
  • Vous obtenez deux certificats différents, tous deux pour le bon nom : SNI est pris en charge et correctement configuré.

Un test un peu plus compliqué qui donnera plus d'informations consiste à ouvrir wireshark et à capturer tout en naviguant. Vous pouvez alors trouver les paquets pertinents en filtrant pour ssl.handshake. Les captures d'écran ci-dessous sont un exemple d'une paire client hello/serveur hello où SNI est supporté :

Client helloServer hello

Encore une fois, l'absence d'un champ server_name dans le server hello n'indique pas que SNI n'est pas pris en charge. Elle indique simplement que le nom de serveur fourni par le client n'a pas été utilisé pour choisir le certificat à utiliser.

-1voto

ddd Points 1

Vous pouvez utiliser openssl pour rechercher et interroger le certificat.

  • récupérer le certificat avec openssl s_client -connect
  • analyser le certificat avec openssl x509
  • grep pour trouver l'information "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

La dernière ligne indique toutes les entrées SNI présentes dans le certificat :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X