Je cherche 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 convient parfaitement.
Merci!
SNI est lancé par le client, vous avez donc besoin d'un client qui le prend en charge. Sauf si vous êtes sur 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 permettent pas), vous pouvez voir si le serveur renvoie un champ nom_serveur dans le hello étendu. Notez que l'absence de ce champ signifie uniquement que le serveur n'a pas utilisé le nom_serveur dans le hello du client pour faciliter la sélection d'un certificat, et non 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 correspondent à la même adresse IP et auxquels une connexion SSL peut être établie. Il est plus simple d'utiliser https, car il vous suffit ensuite de parcourir les deux noms et de voir si le certificat approprié vous est présenté.
Il y a trois résultats:
Un test légèrement plus compliqué qui donnera plus d’informations est d’avoir Wireshark ouvert et de capturer lors de la navigation. Vous pouvez ensuite trouver les paquets pertinents en filtrant ssl.handshake. Les captures d'écran ci-dessous illustrent un exemple de couple client / serveur où SNI est pris en charge:
Encore une fois, bien sûr, l'absence d'un champ nom_serveur dans le serveur Bonjour n'indique pas que SNI n'est pas pris en charge. Le nom de serveur fourni par le client n'a pas été utilisé pour décider du certificat à utiliser.
openssl
. Certains détails sont disponibles:openssl s_client -servername alice.sni.velox.ch -tlsextdebug -msg -connect alice.sni.velox.ch:443
Quelques indications sur l’utilisation de SNI sont fournies lors du test Qualys SSL .La ligne 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:
où
www.SERVERNAME.com
est la valeur SNI que vous testez etwww.YOURSERVER.com
le nom de domaine ou l'adresse IP du serveur compatible TLS que vous testez.Les utilisations de ligne de commande de
openssl
l »s_client
(voir les s_client (1) ) de se connecter au serveur àwww.YOURSERVER.com
sur le port443
. L'-tlsextdebug
option active la sortie de débogage de l'extension TLS. L'-servername
option indique aus_client
programme de transmettrewww.SERVERNAME.com
la valeur du champ SNI dans le paquet ClientHello lors de l'établissement de la liaison TLS.Enfin,
2>/dev/null
cache simplement la sortie stderr (qui peut être bruyante) et le| grep "server name"
filtre de pipeline stdout pour afficher l’extension TLS appelée "nom du serveur" danss_client
la sortie de débogage de l’extension TLS.Si vous voyez une ligne de sortie telle que
alors 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 prend 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'
-servername
option à laquelle le serveur doit répondre avec les informations SNI.la source
-servername
ou non.-servername sdfsdlkfjsdf23.somedomain.somewhere -connect realhost.somedomain.somewhere
=TLS server extension "server name" (id=0), len=0
(Et même résultat s'ils correspondent.) Comment vérifiez-vous qu'il ne correspond pas à un hôte sur le serveur à partir de la sortie?-msg
en plus des paramètres ci-dessus et grep pour "Alert". Si-servername
cela ne va pas, vous obtiendrez quelque chose du genreTLS 1.2 Alert ... warning unrecognized_name
du serveur. @Meitar Je pense que si vous ajoutez cela à la réponse, cela sera utile pour d'autres personnes.-msg
commutateur ajoute simplement un hexdump de messages de protocole TLS. Il n’est pas nécessaire d’observer une erreur de négociation TLS, il serait donc incorrect d’ajouter à cette réponse. De plus, les erreurs de négociation TLS comme celle-ci sont imprimées dans STDOUT, ce qui signifierait que l’2>/dev/null
affichage doit être supprimé de la réponse pour que celle-ci puisse être traitéegrep
en premier lieu. Ce que @bshea demande en réalité, c'est "Comment détecter les erreurs TLS?" ce qui est une question totalement différente de celle de "Ce serveur utilise-t-il la fonctionnalité SNI du protocole TLS?" quel est le sujet ici.STDERR
fichier vers un fichier texte, je ne reçois pas cette erreur. Sans cela,-msg
je ne pourrais trouver aucune autre option affichant les messages de négociation. (en utilisant openssl 1.0.2q). Tant que la pertinence de la réponse vous convient peut-être.Vous pouvez utiliser
openssl
pour récupérer et interroger le certificat.openssl s_client -connect
openssl x509
grep
trouver le "DNS:" infoopenssl s_client -connect alice.sni.velox.ch:443 | openssl x509 -noout -text | grep DNS:
La dernière ligne affiche toutes les entrées SNI présentes dans le certificat:
la source
DNS:...
entrées de la dernière ligne indiquent tous les noms de SNI valides dans le certificat.