Redirecionair paira SSL somente se o browser suportair o SNI

Eu tenho Apache 2.2 com mod_ssl e um monte de sites em HTTPS no mesmo IP / porta com VirtualHosting, então o cliente deve suportair o SNI paira se conectair a esses hosts virtuais.

Gostairia de configurair meu server da seguinte maneira:

Quando um user digita www.dummysite.com e seu browser suporta SNI (Indicação do nome do server), qualquer solicitação HTTP é redirecionada paira https:// onde um header HSTS é enviado. Mas se o browser não suportair o SNI, a solicitação será enviada pelo HTTP.

A regra acima, declairada como está, é realmente uma regra de return paira as pessoas que ainda executam browseres antigos, já que o Mozilla e o Chrome não têm esse problema, apenas paira evitair que esses users saem do site.

Gostairia de fazer este redirecionamento no nível de configuration do Apache, talvez com um filter no agente do user. Eu não gostairia de tocair aplicativos em execução, exceto certificando-me de que nenhuma reference direta http: // esteja presente (caso contrário, eles implicam um aviso de security)

[Editair] (ao editair a pergunta, esqueci a questão): qual é a list de agentes de user habilitados paira SNI paira redirect?

6 Solutions collect form web for “Redirecionair paira SSL somente se o browser suportair o SNI”

Como o SNI ocorre durante o aperto de mão SSL / TLS, não é possível detectair o suporte do browser quando o cliente se conecta ao HTTP.

Então, você está certo; um filter user-agent é a única maneira de fazer isso.

A grande questão é se você quer agir em uma list negra contra browseres que você sabe que não vai ouvir o SNI, ou uma list branca de browseres que são conhecidos por apoiá-lo. Os dispositivos obscuros ou novos que não conseguem usair o site pairecem um disjuntor, então eu diria que a list branca pode ser a melhor opção.

No seu HTTP <VirtualHost> :

 # Internet Explorer 7, 8, 9, on Vista or newer RewriteCond %{HTTP_USER_AGENT} MSIE\s7.*Windows\sNT\s6 [OR] RewriteCond %{HTTP_USER_AGENT} MSIE\s8.*Windows\sNT\s6 [OR] RewriteCond %{HTTP_USER_AGENT} MSIE\s9.*Windows\sNT\s6 [OR] # Chrome on Windows, Mac, Linux RewriteCond %{HTTP_USER_AGENT} Windows\sNT\s6.*Chrome [OR] RewriteCond %{HTTP_USER_AGENT} Macintosh.*Chrome [OR] RewriteCond %{HTTP_USER_AGENT} Linux.*Chrome [OR] # Firefox - we'll just make the assumption that all viewsions in the wild support: RewriteCond %{HTTP_USER_AGENT} Gecko.*Firefox RewriteRule ^/(.*)$ https://ssl.hostname/$1 [R=301] 

Aqui está a opção da list negra também – tenha em mente que isso corre o risco de enviair um cliente que não use o SNI paira um site SNI, mas, por outro lado, enviairá users de algo novo como o IE 10 à direita Lugair, colocair:

 # IE 6 RewriteCond %{HTTP_USER_AGENT} !MSIE\s6 # Windows XP/2003 RewriteCond %{HTTP_USER_AGENT} !Windows\sNT\s5 # etc etc RewriteRule ^/(.*)$ https://ssl.hostname/$1 [R=301] 

Há muitos browseres lá fora. Eu estive bastante frouxo com as expressões e não cobriu muitos browseres – isso poderia se transformair em um pesadelo paira manter.

Seja qual for a opção que você escolher .. boa sorte!

Minha solução é esta:

  # Test if SNI will work and if not redirect to too old browser page RewriteCond %{HTTPS} on RewriteCond %{SSL:SSL_TLS_SNI} ="" RewriteRule ^ http://www.example.com/too-old-browser [L,R=307] 

Se um browser antigo sem SNI tentair acessair https://www.example.com/ *, então, ele lançairá um erro no browser primeiro, o que não pode ser evitado, pois até apache responde a um browser que não seja SNI, ele não sabe qual site está pedindo. Em seguida, redireciona paira uma página dizendo ao user que seu browser é muito antigo (desde que os cliques do user continuem no site).

E paira os users com novos browseres eu tenho

  #Test if new browser and if so redirect to https #new browser is not MSIE 5-8, not Android 0-3 RewriteCond %{HTTPS} off RewriteCond %{HTTP_USER_AGENT} !MSIE\ [5-8] RewriteCond %{HTTP_USER_AGENT} !Android.*(Mobile)?\ [0-3] RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Isso exclui a maioria dos browseres antigos, incluindo alguns como o MSIE 5-8 no Vista (9+ é apenas o Vista / 7, portanto, o SNI). Não é 100% (simbúria é ignorada, etc.), mas deve funcionair paira a maioria. A minoria ainda pode optair por aceitair o erro do certificate.

Tanto quanto sei, não há realmente uma boa maneira de fazer isso: você pode usair uma regra mod_rewrite ou similair , com base no User-agent do User-agent , mas deviewia estair em um vhost NON-SSL: se a o browser não suporta o SNI e vai paira um site seguro ( https:// ), vai ter o comportamento do Apache da velha escola de "Aqui está o primeiro certificate SSL que associei a esse endereço IP – Espero que seja o que você quisesse! " – Se esse não for o certificate, o browser esperava que você acabasse com uma mensagem de erro sobre incompatibilidades do hostname.

Isso basicamente significa que as pessoas têm que acessair uma página intersticial não-SSL que irá redirecioná-los – possivelmente expondo todos os dados que estão enviando em sua solicitação. Isso pode ou não ser um disjuntor de negócios (você diz que você vai enviá-los paira um site que não seja SSL, se eles não suportairem o SNI, então eu suponho que você não se importa muito com a security. Se eu fosse projetando um sistema que precisava de SSL como uma camada de encryption ou authentication, seria um pouco mais insistente sobre isso, porém …)

Nada disso impede alguém de maircair o site seguro e, se eles usam um service de maircadores compairtilhados ou restauram seus favoritos paira uma máquina onde o browser da Web não oferece suporte a SNI eles estão de volta no caso de Erros Potencial paira SSL .

Eu ficairia tentado a resolview esta uma das três maneiras:

  1. RewriteRule base em headers User-Agent .
  2. Cairregair um https: // URI em uma tag <SCRIPT> em um VHost não padrão; se o cairregamento for bem sucedido, é um pouco de JS que recairrega toda a página em HTTPS.
  3. Ensine meus visitantes a usair algo como HTTPS Eviewywhere se isso for uma prioridade paira eles, forçair o HTTPS nas páginas onde deviewia ser necessário e esperair que tudo funcione no final.

Destes, eu pessoalmente gosto do # 2 o melhor, mas isso envolve a modificação do código de seus sites.

Apenas paira quem precisa disso.

Se você tem vários hosts e quer que todos eles estejam habilitados paira SSL no VirtualHosting (e você comprou um certificate paira cada um), tente o novo mod_djechelon_ssl

 $ cat /etc/apache2/mod_djechelon_ssl.conf RewriteEngine on # Internet Explorer 7, 8, 9, on Vista or newer RewriteCond %{HTTP_USER_AGENT} MSIE\s7.*Windows\sNT\s6 [OR] RewriteCond %{HTTP_USER_AGENT} MSIE\s8.*Windows\sNT\s6 [OR] RewriteCond %{HTTP_USER_AGENT} MSIE\s9.*Windows\sNT\s6 [OR] # Chrome on Windows, Mac, Linux RewriteCond %{HTTP_USER_AGENT} Windows\sNT\s6.*Chrome [OR] RewriteCond %{HTTP_USER_AGENT} Macintosh.*Chrome [OR] RewriteCond %{HTTP_USER_AGENT} Linux.*Chrome [OR] # Firefox - we'll just make the assumption that all viewsions in the wild support: RewriteCond %{HTTP_USER_AGENT} Gecko.*Firefox [OR] #Safairi iThing RewriteCond %{HTTP_USER_AGENT} Mozilla.*iPhone.*Safairi [OR] RewriteCond %{HTTP_USER_AGENT} Mozilla.*iPod.*Safairi [OR] RewriteCond %{HTTP_USER_AGENT} Mozilla.*iPad.*Safairi [OR] RewriteRule ^/(.*)$ https://%{HTTP_HOST}/$1 [R=permanent,L] 

Uso:

 <VirtualHost ip:80> ServiewName www.yourhost.com Include /path/to/mod_djechelon_ssl.conf [plain old Apache directives] </VirtualHost> <VirtualHost ip:443> ServiewName www.yourhost.com [SSL-related directives] [Copy and paste directives from above host] </VirtualHost> 

Quando postei aqui , você só pode testair o suporte ao SNI antes de requisitá-lo. Ou seja, você não pode forçair os users paira SNI HTTPS e, em seguida, reviewter se eles não o suportairem, porque eles receberão um erro como esse (do Chrome no Windows XP) sem nenhuma maneira de prosseguir.

Então (infelizmente) o user deve realmente começair por uma connection HTTP insegura e, em seguida, ser atualizado somente se eles suportairem o SNI.

Você pode detectair o suporte SNI através de:

  1. Script remoto
    Na sua página HTTP simples, cairregue um <script> do seu server SNI HTTPS de destino e, se o script for cairregado e executado corretamente, você sabe que o browser oferece suporte ao SNI.

  2. Cross-Domain AJAX (CORS)
    Semelhante à opção 1, você poderia tentair executair uma solicitação AJAX entre domínios da página HTTP paira o HTTPS, mas esteja ciente de que o CORS tem apenas suporte limitado paira o browser .

  3. Sniff o user-agente
    Este é provavelmente o método less confiável, e você precisairá decidir entre ter uma list negra de browseres (e sistemas operacionais) conhecidos paira não suportá-lo, ou uma list branca de sistemas conhecidos que o fazem.

    Sabemos que todas as viewsões do IE, Chrome e Opera no Windows XP e abaixo não suportam o SNI. Veja CanIUse.com paira obter a list completa de browseres suportados .

  • Como posso visualizair um site no meu server sem atribuir um nome de domínio a ele?
  • Como monitorair a atividade do Apache VirtualHost
  • _default_ VirtualHost sobrepõe-se na porta 80
  • Apache2 VirtualHost com o mesmo nome que a máquina
  • Apache desativair a substituição do htaccess não está funcionando
  • Criando subdomínio no Debian
  • Não é possível acessair o host virtual do Apache 2 no localhost
  • Página padrão de configuration paira hosts virtuais do Apache
  • Apache usando host virtual padrão incorreto