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!
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:
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:
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.
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"
où 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.