Como desabilitar o TLS 1.1 e 1.2 no Apache?

12

Eu tenho um servidor LTS Ubuntu 12.04.2 executando o Apache 2.2.22 com mod_ssl e OpenSSL v1.0.1.

Na minha configuração vhosts (tudo o mais dentro do qual se comporta como eu esperaria), eu tenho a linha SSLProtocol com -all +SSLv3 .

Com essa configuração, o TLS 1.1 & 1.2 estão habilitados e funcionam corretamente - o que é contra-intuitivo para mim, como eu esperaria que o somente SSLv3 seria habilitado, dada essa configuração.

Eu posso ativar / desativar o TLSv1 muito bem com -/+TSLv1 e funciona como esperado. Mas +/-TLSv1.1 e +/-TLSv1.2 não são opções de configuração válidas, por isso não posso desativá-las dessa maneira.

Quanto ao motivo pelo qual eu gostaria de fazer isso - estou lidando com um aplicativo de terceiros (sobre o qual não tenho controle) que tenha algum comportamento de bugs com servidores habilitados para TLS, e preciso desabilitá-lo completamente para mover para a frente.

    
por Kyle Lowry 07.06.2013 / 02:01

3 respostas

22

Intrigado por esse bug (e sim, eu consegui reproduzi-lo). Eu dei uma olhada no código-fonte para a última versão estável de mod_ssl e encontrei uma explicação. Fique comigo, isso vai fazer um overflow de pilha amador:

Quando o SSLProtocol foi analisado, isso resulta em um char parecido com isto:

0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1

Ao iniciar um novo contexto de servidor, TODOS os protocolos disponíveis serão habilitados, e o char acima será inspecionado usando algumas operações AND bit a bit para determinar quais protocolos devem ser desativados . Neste caso, onde o SSLv3 é o único protocolo que foi explicitamente habilitado, os 3 outros serão desativados.

O OpenSSL suporta uma configuração de protocolo para TLSv1.1, mas como o SSLProtocol não considera essas opções, ele nunca é desabilitado. O OpenSSL v1.0.1 tem alguns problemas conhecidos com o TLSv1.2, mas se for suportado, suponho que o mesmo acontece com o TLSv1.1; não é reconhecido / manipulado por mod_ssl e, portanto, nunca desabilitado.

Código Fonte Referências para mod_ssl:

SSLProtocol é analisado na linha 925 em pkg.sslmod/ssl_engine_config.c
As opções usadas na função acima são definidas na linha 444 em pkg.sslmod/mod_ssl.h
Todos os protocolos são ativados na linha 586 em pkg.sslmod/ssl_engine_init.c , após o que protocolos específicos são desativados nas linhas subsequentes

Como desativá-lo então?

Você tem algumas opções:

  1. Desativar no arquivo de configuração do OpenSSL com:% Protocols All,-TLSv1.1,-TLSv1.2
  2. Reescreva mod_ssl ; -)
por 15.06.2013 / 14:57
2

O problema também é abordado nos comentários da página mod_ssl do Apache: link

Se o Ubuntu 12.04 tivesse o Apache 2.2.23, o problema não teria ocorrido. De acordo com os comentários, é possível ativar o TLSv1.1 e o TLSv1.2, mas o TLSv1.0 também é ativado:

SSLProtocol All -SSLv2 -SSLv3
    
por 23.12.2014 / 14:50
1

Primeiro de tudo, você deve identificar o que é o vhost padrão para a porta 443 em seu servidor (o primeiro vhost SSL carregado pelo Apache) e editar seu arquivo de configuração. A maioria dos usuários tem um arquivo ssl.conf em seus servidores, com um vhost para a porta 443 configurada lá. Como o nome desse arquivo começa com "s", ele será carregado antes dos vhosts configurados no vhosts.conf (que começa com "v"). Portanto, verifique se esse é o seu caso (a resposta é "sim" para praticamente todos) e altere os protocolos nesse arquivo . Já chega!

Um problema semelhante foi publicado aqui: Como desativar o TLS 1.1 & 1.2 no Apache? . Segundo HBruijn:

Unless you have IP VirtualHosts, in practice the settings from the first occurrence of the SSLProtocol directive are used for the whole server and/or all name-based VirtualHosts supporting TLS

E outro aqui: É possível definir um SSLProtocol no Apache para um único VirtualHost (poodle)? . De acordo com vallismortis:

You can set the SSLProtocol only for the first VirtualHost in the configuration file. All subsequent VirtualHost entries will inherit that setting from the first entry and silently ignore their own setting due to an OpenSSL bug.

A propósito: o vhost padrão em um servidor, para uma determinada porta, é aquele que atende as solicitações para aquela porta, que chegam ao servidor sem uma identificação de nome de servidor (ou com um nome de servidor incorreto). Exemplo: um IP digitado na barra de endereço do seu navegador ou um redirecionamento incorreto causado por uma tabela DNS incorreta.

    
por 03.10.2017 / 22:39