Posso detectar se o cliente SSL não suporta Indicação do nome do servidor e fornecer o site HTTP padrão nesse caso?

8

Eu precisarei usar SSL SNI, mas infelizmente de um post de blog recente da Cloudflare, apenas 90% da rede o suporta. Como posso (por exemplo, com o nginx) detectar se o cliente suporta SNI e fornecer / redirecionar para a versão HTTP do site? Isso é possível? De que outra forma eu não posso perder os 10% do tráfego usando o SNI? É correto assumir 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.

    
por cedivad 10.03.2015 / 18:29

2 respostas

10

Se você quiser oferecer HTTPS desde o início, é necessário fornecer um certificado aceito pelo cliente desde o início. Porque senão o cliente não aceitará a conexão SSL e você não poderá redirecionar o cliente para um site diferente ou uma versão somente HTTP. Isto significa apoiar este caso você

  • também precisa 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 um certificado padrão que não corresponde à maioria dos seus nomes. Nesse caso, você só pode fornecer ao cliente uma página diferente ou redirecioná-lo se o cliente aceitar esse certificado inválido.

Se você não precisa ter HTTPS desde o início, isto é, se o cliente geralmente se conecta primeiro com HTTP simples, então você pode tentar detectar o suporte a SNI para que você possa redirecionar o cliente posteriormente. Isso pode ser feito incluindo uma imagem, algum JavaScript ou algo semelhante em seu 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 man-in-the-middle, porque todo o man-in-the-middle tem que fazer é servir algum certificado diferente ou tornar o HTTPS indisponível, porque nesse caso você nunca tentará atualizar a conexão para HTTPS. Além disso, isso pode ser usado para fazer parecer que os clientes suportam SNI, se o intermediário fizer isso. 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. Então, enquanto isso seria possível, em teoria, não é recomendado porque você pode simplesmente man-in-the-middle tudo e, portanto, fazer o ponto principal de usar HTTPS moot.

    
por 10.03.2015 / 19:25
0

Como eu postei no StackOverflow , você só pode testar o suporte a SNI anterior para exigir isto. Ou seja, você não pode forçar os usuários a usar o SNI HTTPS e depois retroceder caso eles não o suportem, porque eles receberão um erro como esse (do Chrome no Windows XP) sem nenhuma maneira de proceder.

Então (infelizmente) o usuário tem que começar de fato por uma conexão HTTP insegura e depois ser atualizado apenas se eles suportarem SNI.

Você pode detectar suporte SNI via:

  1. Script remoto
    Na sua página HTTP simples, carregue um <script> de seu servidor SNI HTTPS de destino e, se o script for carregado e executado corretamente, você sabe que o navegador suporta SNI.

  2. AJAX entre domínios (CORS)
    Semelhante à opção 1, você poderia tentar executar uma solicitação AJAX de vários domínios da página HTTP para o HTTPS, mas esteja ciente de que o CORS tem apenas limitado suporte ao navegador .

  3. Sniff o user-agent
    Este é provavelmente o método menos confiável, e você precisará decidir entre ter uma lista negra de navegadores (e sistemas operacionais) conhecida por não suportá-la, ou uma lista branca de sistemas conhecidos que o façam.

    Sabemos que todas as versões do IE, do Chrome & Opera no Windows XP e abaixo não suportam SNI. Consulte CanIUse.com para obter uma lista completa de navegadores compatíveis .

por 06.09.2016 / 07:31

Tags