Cette rubrique explique comment résoudre les exceptions d'accès HTTPS causées par des problèmes de compatibilité de l'indication du nom de serveur (SNI) entre les clients, après l'ajout des services web concernés à Web Application Firewall (WAF).
Contexte
L'hébergement virtuel a été introduit pour remédier à la pénurie d'adresses IP. Cette technologie permet à un seul serveur HTTP ou HTTPS d'héberger plusieurs noms de domaine en partageant la même adresse IP. Chaque nom de domaine agit alors comme un hôte virtuel. Le serveur achemine les requêtes vers les différents hôtes virtuels en fonction des en-têtes Host inclus dans les requêtes clientes. Par exemple, avant qu'un navigateur ne puisse accéder à un site web HTTPS hébergé sur un serveur web où l'hébergement virtuel est activé, il doit établir une connexion SSL avec le serveur et demander le certificat serveur requis. Toutefois, le serveur ne peut pas identifier le nom de domaine consulté et ne peut donc pas renvoyer le certificat approprié.
Le protocole SNI est une extension SSL/TLS conçue pour résoudre ce problème. Avant l'établissement d'une connexion SSL avec le serveur, le navigateur envoie au serveur le nom d'hôte spécifiant le nom de domaine à consulter. Le serveur identifie alors le domaine et renvoie le certificat correspondant.
La plupart des systèmes d'exploitation et des navigateurs prennent en charge le protocole SNI. OpenSSL 0.9.8 intègre nativement la prise en charge de SNI. Les versions récentes des serveurs NGINX prennent également en charge cette fonctionnalité.
Description du problème
Si votre site web rencontre des exceptions d'accès HTTPS après avoir été ajouté à WAF, il est possible que les clients concernés ne prennent pas en charge le protocole SNI.
Lorsqu'un navigateur ne prenant pas en charge SNI tente d'accéder à un site web protégé par WAF, ce dernier ne peut pas identifier le nom de domaine spécifique demandé ni obtenir le certificat requis pour interagir avec le navigateur. Dans ce scénario, WAF utilise le certificat par défaut pour finaliser la procédure de handshake avec le navigateur, ce qui entraîne l'affichage de l'erreur « Certificate not trusted » par le navigateur.
Si un client ne prend pas en charge SNI, les problèmes suivants peuvent survenir :
Si le client est une application mobile exécutée sous iOS, l'accès aboutit. En revanche, si le client est une application mobile exécutée sous Android, l'accès échoue.
Si le client est un navigateur, l'erreur « Certificate not trusted » s'affiche.
Solution
Capturez les paquets de handshake SSL côté client pour déterminer si celui-ci prend en charge SNI. Dans cet exemple, le navigateur Chrome est utilisé pour accéder au site web officiel d'Alibaba Cloud.
Si le paquet Client Hello contient des informations SNI, le client prend en charge ce protocole.
Dans le cas contraire, le client ne prend pas en charge SNI. Voici nos recommandations :
Mettez à jour votre navigateur ou utilisez la dernière version disponible, telle que Chrome ou Firefox.
Dans les scénarios de rappel tiers, tels que les rappels WeChat ou Alipay, utilisez l'adresse IP du serveur d'origine pour contourner WAF.
Compatibilité SNI
Le protocole SNI est compatible avec TLS 1.0 et les versions ultérieures, mais n'est pas pris en charge par SSL.
-
SNI prend en charge les navigateurs de bureau suivants :
Chrome 5 et versions ultérieures
Chrome 6 et versions ultérieures (Windows XP)
Firefox 2 et versions ultérieures
IE 7 et versions ultérieures (sur Windows Vista/Server 2008 et versions ultérieures, à l'exclusion de toute version d'IE sur Windows XP)
Konqueror 4.7 et versions ultérieures
Opera 8 et versions ultérieures
Safari 3.0 sur Windows Vista/Server 2008 et versions ultérieures, ou Mac OS X 10.5.6 et versions ultérieures
-
SNI prend en charge les bibliothèques suivantes :
GNU TLS
Java 7 et versions ultérieures (uniquement en tant que client)
HTTP client 4.3.2 et versions ultérieures
libcurl 7.18.1 et versions ultérieures
NSS 3.1.1 et versions ultérieures
OpenSSL 0.9.8j et versions ultérieures
OpenSSL 0.9.8f et versions ultérieures (indicateurs requis)
QT 4.8 et versions ultérieures
Python3, Python 2.7.9 et versions ultérieures
-
SNI prend en charge les navigateurs mobiles suivants :
Android Browser sur 3.0 Honeycomb et versions ultérieures
iOS Safari sur iOS 4 et versions ultérieures
Windows Phone 7 et versions ultérieures
-
SNI prend en charge les serveurs suivants :
Apache 2.2.12 et versions ultérieures
Apache Traffic Server 3.2.0 et versions ultérieures
HAProxy 1.5 et versions ultérieures
IIS 8.0 et versions ultérieures
lighttpd 1.4.24 et versions ultérieures
LiteSpeed 4.1 et versions ultérieures
Nginx 0.5.32 et versions ultérieures
-
SNI prend en charge les interfaces de ligne de commande suivantes :
cURL 7.18.1 et versions ultérieures
wget 1.14 et versions ultérieures