Posso detectar se o cliente SSL não suporta Indicação de Nome de Servidor e fornecer o site HTTP padrão nesse caso?

8

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.

cedivad
fonte
Uma questão intimamente relacionada-foi perguntado aqui: Redirecionar para SSL somente se suportes navegador SNI
Simon Médio

Respostas:

10

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ê

  • é necessário ter um único certificado contendo todos os seus domínios, para que você possa fornecer aos clientes não SNI um certificado adequado. Mas, neste caso, você não precisa de SNI.
  • ou você precisa instalar algum certificado padrão que não corresponda à maioria dos seus nomes. Nesse caso, você pode fornecer ao cliente apenas uma página diferente ou redirecioná-la se o cliente aceitar esse certificado inválido.

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.

Steffen Ullrich
fonte
0

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:

  1. 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.

  2. 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 .

  3. 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 .

Simon East
fonte