Atualizar conexão HTTP para SSL / TLS

8

Atualmente, tenho um servidor que redireciona automaticamente todas as solicitações HTTP para o site HTTPS equivalente. O problema é que parece que alguns navegadores não aceitam o certificado SSL (StartSSL.com) ou não suportam SNI, portanto recebem um aviso de Certificado e o usuário não continuará navegando no site.

Existe algum mecanismo que tente fazer o navegador usar HTTPS em vez de HTTP simples e quando isso não funcionar (por exemplo, o certificado não é aceito ou o SNI não é suportado) ele continua usando HTTP.

Atualmente estou usando o Apache 2.4 com vários hosts virtuais que redirecionam a conexão HTTP com Redirect / https://domain.example/ .

    
por foxylion 29.03.2014 / 12:23

3 respostas

15

Um navegador nunca deve fazer o downgrade de si mesmo para http, se https não funcionar, porque tudo que um invasor precisa fazer é tornar o https indisponível (por exemplo, porta de bloco 443). Assim, a única maneira de fazer isso é instruindo o navegador do servidor para fazer isso, por exemplo, enviando um redirecionamento http. É claro que isso deve ser enviado por uma conexão segura (caso contrário, um man-in-the-middle poderia fingir), mas infelizmente é exatamente o seu problema que a conexão segura falhe.

Em resumo: Não, não é possível e é melhor assim.

BTW, todos os navegadores modernos suportam SNI, mas nem todos os aplicativos (por exemplo, aplicativos Java, etc.) fazem isso. Se você tiver vários domínios no servidor da Web, mas apenas um único necessário para esses aplicativos, poderá definir o certificado desse domínio como o padrão. Caso contrário, você precisará obter um certificado (mais caro) que contenha todos os domínios necessários como nomes alternativos de assunto.

Edite com outra ideia: o que você pode tentar fazer é baixar uma imagem do seu lado como https e verificar o sucesso com um manipulador onerror na img-tag. Talvez isso não acione um aviso visível para o usuário, mas, ao invés disso, simplesmente não carregue. E se for bem sucedido você sabe que o acesso https é possível e redireciona o usuário.

Além disso, você deve se perguntar por que deseja oferecer https, se aceitar o acesso com http também. Existem dados que devem ser protegidos ou não são. Contanto que você ofereça um fallback para http, é fácil para um invasor aplicar http em vez de https.

    
por 29.03.2014 / 13:15
3

Em primeiro lugar, deve ser possível especificar um certificado para ser usado para todos os clientes que não possuem suporte a SNI. Isso significa que de todos os domínios hospedados nesse endereço IP, você pode ter pelo menos um deles trabalhando para clientes sem SNI.

O que você poderia fazer ao redirecionar de http para https é um redirecionamento de dois estágios. O primeiro redirecionamento de http para https usa o nome de domínio, que você garantiu que funcionaria com ou sem suporte a SNI. O URL original completo teria que ser incluído, de modo que a partir desse site https você possa redirecionar para o local apropriado.

O nome de domínio, que funciona com ou sem SNI, pode se comportar de maneira diferente, dependendo se o SNI é suportado pelo cliente. Dessa forma, você saberia que o cliente suportava o SNI antes de redirecioná-lo para um domínio, o que exigia SNI.

Como exatamente configurar isto no Apache vai ser um pouco de adivinhação do meu lado (já que nunca configurei o Apache com mais de um certificado). Eu acho que a maneira de fazer isso seria criar hosts virtuais baseados em nome para todos os domínios, incluindo o domínio intermediário.

Em seguida, crie um host virtual padrão para clientes sem SNI, que usa o mesmo certificado daquele que usa o nome. Esses dois hosts virtuais com certificado idêntico enviarão redirecionamentos diferentes para os clientes, dependendo se eles suportam SNI.

Por fim, eu habilitaria o IPv6 no servidor. Com o IPv6, você obtém endereços IP suficientes para alocar um em cada host virtual. O mesmo conjunto de hosts virtuais pode ser baseado em nome IPv4 e IP baseado em IPv6, portanto, você não precisa duplicar nenhuma configuração dessa maneira.

O resultado final seria uma configuração que funciona desde que o cliente suporte SNI ou IPv6. Apenas os clientes que suportam nenhum terão um problema, mas você ainda poderá detectar um redirecionamento diferente ou uma mensagem de erro para esse servidor.

Quanto aos clientes que não gostam da CA, minha única sugestão é reconhecê-los por seu user-agent e lidar com eles de acordo com sua aparência. Verifique se você tem um link para o site https, no qual eles podem clicar no caso de você incluir muitos clientes por engano.

    
por 01.04.2014 / 23:22
0

Apenas um palpite: pode ser que você não tenha uma diretiva SSLCertificateChainFile na sua configuração do apache, que inclui o arquivo sub.class1.server.ca.pem que você precisa para o StartSSL?

    
por 01.04.2014 / 22:49