J'aurai besoin d'utiliser SSL SNI, mais malheureusement, à partir d'un récent blog Cloudflare, seulement 90% du réseau le prend en charge. Comment puis-je (par exemple, avec nginx) détecter si le client prend en charge SNI et fournir / rediriger vers la version HTTP du site Web? Est-ce possible? Sinon, comment ne pas perdre les 10% du trafic en utilisant SNI? Est-il correct de supposer que je ne serais pas en mesure de rediriger le trafic HTTPS vers HTTP sans certificat valide, et donc cette demande est impossible?
Je vous remercie.
Réponses:
Si vous souhaitez proposer HTTPS depuis le début, vous devez fournir un certificat accepté par le client depuis le début. Dans le cas contraire, le client n'acceptera pas la connexion SSL et vous ne pourrez pas rediriger le client vers un autre site ou une version HTTP uniquement. Cela signifie que vous soutenez ce cas
Si vous n'avez pas besoin d'avoir HTTPS depuis le début, c'est-à-dire si le client se connecte généralement en premier avec HTTP simple, vous pouvez essayer de détecter la prise en charge SNI afin de pouvoir rediriger le client plus tard. Cela peut être fait en incluant une image, du JavaScript ou des éléments similaires de votre site HTTPS et si le chargement réussit, vous savez que le client prend en charge SNI ou ignore les erreurs de certificat.
Bien sûr, cela laisse tout ouvert aux attaques de l'homme du milieu, car tout ce que l'homme du milieu doit faire est de servir un certificat différent ou de rendre HTTPS indisponible du tout, car dans ce cas, vous n'essaierez jamais pour mettre à niveau la connexion vers HTTPS. De plus, cela peut être utilisé pour donner l'impression que les clients prennent en charge SNI, si l'homme du milieu le fait à la place. Et non seulement les clients non SNI sont affectés par cela, mais les clients compatibles SNI peuvent uniquement être interceptés. Donc, bien que cela soit possible en théorie, cela n'est pas recommandé car vous pouvez simplement tout gérer par le milieu et ainsi faire le point principal de l'utilisation du moot HTTPS.
la source
Comme je l'ai posté sur StackOverflow , vous ne pouvez tester le support SNI qu'avant de l'exiger. Autrement dit, vous ne pouvez pas forcer les utilisateurs à utiliser SNI HTTPS, puis à retomber s'ils ne le prennent pas en charge, car ils recevront une erreur comme celle-ci (de Chrome sur Windows XP) sans aucun moyen de continuer.
Donc (malheureusement), l'utilisateur doit réellement commencer par une connexion HTTP non sécurisée, puis être mis à niveau uniquement s'il prend en charge SNI.
Vous pouvez détecter la prise en charge SNI via:
Script distant
À partir de votre page HTTP standard, chargez un à
<script>
partir de votre serveur SNI HTTPS de destination et si le script se charge et s'exécute correctement, vous savez que le navigateur prend en charge SNI.AJAX inter-domaines (CORS)
Semblable à l'option 1, vous pouvez essayer d'effectuer une demande AJAX inter-domaines de la page HTTP vers le HTTPS, mais sachez que CORS ne dispose que d'une prise en charge limitée du navigateur .
Renifler l'agent utilisateur
C'est probablement la méthode la moins fiable, et vous devrez décider entre avoir une liste noire de navigateurs (et systèmes d'exploitation) connue pour ne pas la prendre en charge, ou une liste blanche de systèmes connus qui le font.
Nous savons que toutes les versions d'IE, Chrome et Opera sur Windows XP et ci-dessous ne prennent pas en charge SNI. Voir CanIUse.com pour la liste complète des navigateurs pris en charge .
la source