Precisarei usar o SSL SNI, mas, infelizmente, em um post recente do Cloudflare, apenas 90% da rede o suporta. Como posso (por exemplo, com nginx) detectar se o cliente suporta SNI e fornece / redireciona para a versão HTTP do site? Isso é possível? De que outra forma não posso perder os 10% do tráfego usando o SNI? É correto supor que eu não seria capaz de redirecionar o tráfego HTTPS para HTTP sem um certificado válido e, portanto, essa solicitação é impossível?
Obrigado.
Respostas:
Se você deseja oferecer HTTPS desde o início, deve fornecer um certificado aceito pelo cliente desde o início. Porque, caso contrário, o cliente não aceitará a conexão SSL e você não poderá redirecionar o cliente para um site diferente ou para uma versão somente HTTP. Isso significa apoiar este caso, você
Se você não precisar do HTTPS desde o início, ou seja, se o cliente geralmente se conectar primeiro com o HTTP simples, tente detectar o suporte ao SNI para poder redirecionar o cliente posteriormente. Isso pode ser feito incluindo uma imagem, algum JavaScript ou algo semelhante no site HTTPS e, se o carregamento for bem-sucedido, você saberá que o cliente suporta SNI ou ignora erros de certificado.
É claro que isso deixa tudo aberto para ataques do tipo man-in-the-middle, porque tudo que o man-in-the-middle precisa fazer é servir um certificado diferente ou tornar o HTTPS indisponível, pois nesse caso você nunca tentará para atualizar a conexão para HTTPS. Além disso, isso pode ser usado para fazer parecer que os clientes suportam SNI, se o man-in-the-middle o fizer. E não apenas os clientes não SNI são afetados por isso, mas os clientes compatíveis com SNI só podem ser interceptados. Portanto, embora isso seja possível em teoria, isso não é recomendado, porque você pode simplesmente fazer tudo do meio do caminho e, assim, fazer o ponto principal do uso do HTTPS.
fonte
Como publiquei no StackOverflow , 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, em seguida, fazer o backup, caso não o suporte, pois eles 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 .
Cheirar 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