Eu tenho o Apache 2.2 com mod_ssl e vários sites em HTTPS no mesmo IP / porta do VirtualHosting, portanto, o cliente deve suportar o SNI para se conectar a esses hosts virtuais.
Gostaria de configurar meu servidor da seguinte maneira:
Quando um usuário digita www.dummysite.com e seu navegador suporta SNI (Server Name Indication), qualquer solicitação HTTP é redirecionada para https://
onde um cabeçalho HSTS é enviado. Mas se o navegador não suportar SNI, a solicitação será atendida por HTTP.
A regra acima, declarada como está, é na verdade uma regra de fallback para as pessoas que ainda executam navegadores antigos, pois o Mozilla e o Chrome não têm esse problema, apenas para evitar deixar esses usuários fora do site.
Eu gostaria de fazer isso redirecionando no nível de configuração do Apache, talvez com um filtro no agente do usuário. Eu não gostaria de tocar em aplicativos em execução, exceto me certificando de que nenhuma referência direta http: // esteja presente (caso contrário, eles implicam em um aviso de segurança)
[Edit] (ao editar a pergunta que eu esqueci a pergunta): o que é a lista de agentes de usuário SNI habilitados para redirecionar?
fonte
Minha solução é esta:
Se um navegador antigo sem SNI tentar acessar https://www.example.com/ *, ele lançará um erro no navegador primeiro, o que não pode ser evitado, desde que o apache responda a um navegador que não seja SNI. qual site ele está solicitando. Em seguida, ele é redirecionado para uma página informando ao usuário que seu navegador é muito antigo (desde que os cliques do usuário continuem no site).
E para usuários com novos navegadores eu tenho
Isso exclui a maioria dos navegadores antigos, incluindo alguns como o MSIE 5-8 no Vista (9+ é apenas o Vista / 7, portanto, suporta SNI). Não é 100% (o symbian é ignorado etc.), mas deve funcionar para a maioria. A minoria ainda pode optar por aceitar o erro de certificado.
fonte
Pelo que sei, não há realmente uma boa maneira de fazer isso - você pode usar uma regra mod_rewrite ou semelhante condicionalmente com base no
User-agent
cabeçalho, mas ela teria que ser em um vhost não SSL: Se o navegador não suporte ao SNI e ele acessa umhttps://
site seguro ( ), obtendo o comportamento Apache da velha escola de "Aqui está o primeiro certificado SSL que associei a esse endereço IP - Espero que seja o que você queria!" - Se esse não é o certificado que o navegador esperava, você terminará com uma mensagem de erro sobre incompatibilidade de nome de host.Isso basicamente significa que as pessoas precisam acessar uma página intersticial não SSL que as redirecionará - possivelmente expondo os dados que estão enviando em sua solicitação. Isso pode ou não ser um desagregador (você diz que os enviará para um site não SSL de qualquer maneira, se eles não suportarem SNI, por isso suponho que você não se importe muito com segurança). Ao projetar um sistema com necessidade de SSL como uma camada de criptografia ou autenticação, eu seria um pouco mais insistente quanto a isso ...)
Porém, nada disso impede alguém de marcar o site como favorito - e, se usarem um serviço de favoritos compartilhado ou restaurarem seus favoritos em uma máquina em que o navegador da Web não for compatível com SNI, eles voltarão ao caso de Potencial para SSL-Erros .
fonte
Eu ficaria tentado a resolver essa de três maneiras:
RewriteRule
com base emUser-Agent
cabeçalhos.<SCRIPT>
tag em um VHost não padrão; se o carregamento for bem-sucedido, é um pouco de JS que recarrega a página inteira em HTTPS.Destes, eu pessoalmente gosto do segundo melhor, mas isso envolve a modificação do código dos seus sites.
fonte
Apenas para quem precisa.
Se você possui vários hosts e deseja que todos eles sejam habilitados para SSL no VirtualHosting (e você comprou um certificado para cada um), tente o novo
mod_djechelon_ssl
Uso:
fonte
Como publiquei aqui , você só pode testar o suporte ao SNI antes de solicitá-lo. Ou seja, você não pode forçar os usuários a entrar no SNI HTTPS e fazer o backup se eles não o suportarem, porque receberão um erro como este (do Chrome no Windows XP) sem nenhuma maneira de prosseguir.
Portanto (infelizmente) o usuário precisa realmente começar por uma conexão HTTP insegura e ser atualizado apenas se suportar SNI.
Você pode detectar o suporte SNI através de:
Script remoto
Na sua página HTTP simples, carregue um
<script>
do servidor SNI HTTPS de destino e, se o script carregar e executar corretamente, você saberá que o navegador suporta SNI.AJAX entre domínios (CORS)
Semelhante à opção 1, você pode tentar executar uma solicitação AJAX entre domínios da página HTTP para o HTTPS, mas esteja ciente de que o CORS possui apenas suporte limitado ao navegador .
Detectar o agente do usuário
Este é provavelmente o método menos confiável, e você precisará decidir entre ter uma lista negra de navegadores (e sistemas operacionais) que não são compatíveis ou uma lista branca de sistemas conhecidos que o fazem.
Sabemos que todas as versões do IE, Chrome e Opera no Windows XP e abaixo não são compatíveis com SNI. Consulte CanIUse.com para obter a lista completa dos navegadores suportados .
fonte