web-dev-qa-db-fra.com

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

Je recherche un moyen simple de savoir si un serveur utilise l'extension SSL d'indication de nom de serveur pour son certificat HTTPS sur un site Web. Une méthode qui utilise un navigateur ou une ligne de commande Unix est très bien.

Merci!

44
spookylukey

SNI est lancé par le client, vous avez donc besoin d'un client qui le prend en charge. À 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 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 uniquement que le serveur n'a pas utilisé le nom_serveur dans le client bonjour pour aider à choisir un certificat, pas qu'il ne le prend pas en charge.

Donc, dans la pratique, le test le plus simple consiste simplement à essayer de se connecter. Pour cela, vous devez connaître deux noms qui se résolvent sur la même IP, à laquelle une connexion SSL peut être établie. https est le plus simple car vous pouvez simplement parcourir les deux noms et voir si le bon certificat vous est présenté.

Il y a trois résultats:

  • Vous obtenez un certificat générique (ou un 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 prend pas en charge SNI, soit il a été mal configuré
  • Vous obtenez deux certificats différents, tous deux pour le nom correct: SNI est pris en charge et correctement configuré.

Un test un peu plus compliqué qui donnera plus d'informations consiste à ouvrir et à capturer Wharkshark pendant la navigation. Vous pouvez ensuite trouver les paquets appropriés en filtrant ssl.handshake. Les captures d'écran ci-dessous sont un exemple d'une paire Bonjour client/Bonjour serveur où SNI est pris en charge:

Client helloServer hello

Encore une fois, bien sûr, l'absence d'un champ nom_serveur dans le bonjour du serveur n'indique pas que SNI n'est pas pris en charge. Simplement que le nom de serveur fourni par le client n'a pas été utilisé pour décider du certificat à utiliser.

23

Le liner que vous recherchez probablement pour détecter la présence d'un en-tête d'extension d'indication de nom de serveur SSL/TLS est:

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

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 compatible TLS que vous testez.

La ligne de commande utilise le s_client De openssl (voir s_client (1) ) pour se connecter au serveur à www.YOURSERVER.com Sur le port 443 . L'option -tlsextdebug Active la sortie de débogage de l'extension TLS. L'option -servername Indique au programme s_client De passer www.SERVERNAME.com Comme valeur du champ SNI dans le paquet ClientHello pendant la prise de contact TLS.

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

Si vous voyez une ligne de sortie telle que

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

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

30
Meitar