Tengo Apache 2.2 con mod_ssl y un montón de sitios en HTTPS en el mismo IP / puerto con VirtualHosting, por lo que el cliente debe ser compatible con SNI para conectarse a esos hosts virtuales.
Me gustaría configurar mi servidor de la siguiente manera:
Cuando un usuario escribe www.dummysite.com y su navegador admite SNI (Indicación de nombre del servidor), cualquier solicitud HTTP se redirige a https://
donde se envía un encabezado HSTS. Pero si el navegador no admite SNI, entonces la solicitud es atendida por HTTP.
La regla anterior, tal como está, es en realidad una regla alternativa para aquellas personas que aún ejecutan navegadores antiguos, ya que Mozilla y Chrome no tienen este problema, solo para evitar dejar a estos usuarios fuera del sitio.
Me gustaría hacer esto redirigiendo en el nivel de configuración de Apache, tal vez con un filtro en el agente de usuario. No me gustaría tocar las aplicaciones en ejecución, excepto asegurarme de que no haya referencias directas de http: // (de lo contrario, implican una advertencia de seguridad)
[Editar] (al editar la pregunta, olvidé la pregunta): ¿cuál es la lista de agentes de usuario con SNI para redirigir?
fuente
Mi solución es esta:
Si un navegador antiguo sin SNI intenta acceder a https://www.example.com/ *, primero arrojará un error en el navegador, que no puede evitarse hasta que Apache responda a un navegador que no sea SNI que no conoce qué sitio está solicitando. Luego, redirige a una página que le dice al usuario que su navegador es demasiado antiguo (siempre que los clics del usuario continúen en el sitio web).
Y para los usuarios con nuevos navegadores tengo
Eso excluye la mayoría de los navegadores antiguos, incluidos algunos como MSIE 5-8 en Vista (9+ es solo Vista / 7, por lo que es compatible con SNI). No es 100% (se ignora Symbian, etc.) pero debería funcionar para la mayoría. La minoría aún puede elegir aceptar el error del certificado.
fuente
Por lo que sé, no hay realmente una buena manera de hacer esto: puede usar un regla mod_rewrite o similar condicionalmente basada en el
User-agent
encabezado, pero tendría que estar en un host NO SSL: si el navegador no lo hace admite SNI y va a unhttps://
sitio seguro ( ) que obtendrá el comportamiento Apache de la vieja escuela de "Aquí está el primer certificado SSL que he asociado con esa dirección IP - ¡Espero que sea lo que querías!" - Si ese no es el certificado que esperaba el navegador, terminará con un mensaje de error sobre las discrepancias del nombre de host.Básicamente, esto significa que las personas deben acceder a una página intersticial que no sea SSL que los redirigirá, posiblemente exponiendo cualquier dato que envíen en su solicitud. Esto puede o no ser un factor decisivo (usted dice que de todos modos los enviará a un sitio que no sea SSL si no son compatibles con SNI, por lo que supongo que no le importa mucho la seguridad. Si yo fuera diseñando un sistema que necesitaba SSL como capa de cifrado o autenticación, sería un poco más insistente al respecto ...)
Sin embargo, nada de eso impide que alguien marque el sitio seguro, y si usan un servicio de marcadores compartido o restauran sus marcadores en una máquina donde el navegador web no admite SNI, están de vuelta en el caso de errores potenciales por SSL .
fuente
Estaría tentado a resolver esta de tres maneras:
RewriteRule
Residencia enUser-Agent
encabezados.<SCRIPT>
etiqueta en un VHost no predeterminado; Si la carga se realiza correctamente, es un poco de JS que vuelve a cargar toda la página en HTTPS.De estos, personalmente me gusta el # 2 el mejor, pero eso implica modificar el código de sus sitios.
fuente
Solo para cualquiera que lo necesite.
Si tiene varios hosts y desea que todos estén habilitados para SSL en VirtualHosting (y compró un certificado para cada uno), pruebe el nuevo
mod_djechelon_ssl
Uso:
fuente
Como publiqué aquí , solo puede probar el soporte SNI antes de solicitarlo. Es decir, no puede forzar a los usuarios a SNI HTTPS y luego retroceder si no lo admiten, porque recibirán un error como este (de Chrome en Windows XP) sin forma de proceder.
Entonces (desafortunadamente) el usuario tiene que comenzar con una conexión HTTP insegura y luego actualizarse solo si admite SNI.
Puede detectar el soporte SNI a través de:
Script remoto
Desde su página HTTP simple, cargue un archivo
<script>
desde su servidor SNI HTTPS de destino y si el script se carga y ejecuta correctamente, sabe que el navegador admite SNI.Cross-Domain AJAX (CORS)
Similar a la opción 1, puede intentar realizar una solicitud AJAX entre dominios desde la página HTTP al HTTPS, pero tenga en cuenta que CORS solo tiene un soporte de navegador limitado .
Sniff the user-agent
Este es probablemente el método menos confiable, y tendrá que decidir entre tener una lista negra de navegadores (y sistemas operativos) que no son compatibles, o una lista blanca de sistemas conocidos que lo hacen.
Sabemos que todas las versiones de IE, Chrome y Opera en Windows XP y versiones posteriores no son compatibles con SNI. Consulte CanIUse.com para obtener una lista completa de los navegadores compatibles .
fuente