Estou recebendo erro: SSL3_GET_RECORD: falha na descriptografia ou registro incorreto do mac

7

Eu tenho meu próprio servidor (onde estou executando Apache/2.4.27) e hoje percebi que (Brave e Google Chrome - computadores diferentes) estou recebendo dos meus sites esse erro;

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

E o estranho é que estou recebendo esse erro a cada quinto clique no meu site.

Do meu arquivo conf:

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mywebsite/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mywebsite/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mywebsite/chain.pem
SSLCompression off

de options-ssl-apache.conf;

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off

Eu verifiquei o arquivo de log do site, mas nada, também nada aqui; /var/log/apache2/error.log

Estou tentando descobrir o que está causando esse erro. Alguma idéia de onde posso encontrar mais informações ou, melhor ainda, como resolver esse problema?

EDITAR:

Se eu tentar openssl s_client -connect mywebsite.com:443, ele retornará:

Estou a usar: OpenSSL 1.1.0f

CONNECTED(00000003)

...

3073276480:error:1408F119:SSL routines:ssl3_get_record:decryption failed or bad record mac:../ssl/record/ssl3_record.c:469:

OUTRA EDIÇÃO:

Como o @quadruplebucky sugeriu, mudei o options-ssl-apache.conf para:

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite           HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1
SSLHonorCipherOrder     on
SSLCompression          off

#SSLSessionTickets       off

Também tentei adicionar SSLProtocol all -SSLv2 -SSLv3ao meu arquivo conf do host virtual e, ao mesmo tempo, mudei algumas coisas aqui;/etc/apache2/mods-available/ssl.conf

#SSLCipherSuite HIGH:!aNULL
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

SSLHonorCipherOrder on

#   The protocols to enable.
#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
#   SSL v2  is no longer supported
SSLProtocol all -SSLv2 -SSLv3

EDITAR:

Depois de alterar o LogLevel, Infoele retorna:

[Sat Jul 08 13:34:53.374307 2017] [ssl:info] [pid 8710] [client] AH02008: SSL library error 1 in handshake (server mywebsite:443)
[Sat Jul 08 13:34:53.374717 2017] [ssl:info] [pid 8710] SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message
[Sat Jul 08 13:34:53.374750 2017] [ssl:info] [pid 8710] [client] AH01998: Connection closed to child 1 with abortive shutdown (server mywebsite:443)

EDITAR:

Se eu executar com a opção -crlf, assim:

openssl s_client -crlf -connect mywebsite:443

Não estou recebendo nenhum erro?

Mais uma coisa, se eu alterar o LogLevel para depuração, antes desse erro, estou recebendo o seguinte:

[Tue Jul 11 23:00:38.641568 2017] [core:debug] [pid 26561] protocol.c(1273): [client 188.64.25.162:23165] AH00566: request failed: malformed request line
[Tue Jul 11 23:00:38.641634 2017] [headers:debug] [pid 26561] mod_headers.c(900): AH01503: headers: ap_headers_error_filter()

Então, depois disso, o mesmo erro ocorrerá:

SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message

openssl version
OpenSSL 1.1.0f  25 May 2017
user134969
fonte
Não deve ser possível que nenhum erro de configuração do nó de extremidade cause 'descriptografia incorreta ou mac' (alerta 20). Existe algo na rede entre esses clientes e este servidor, como um firewall, IDS, IPS, DLP ou até um roteador 'inteligente'? Você pode testar repetidamente (já que isso pode depender dos dados e, portanto, quase aleatoriamente) conectar-se a partir do próprio servidor ou de uma máquina no mesmo segmento que o servidor?
Dave_thompson_085
mostre o conteúdo relevante do host virtual * .443 (todo o host virtual, se necessário), também a saída de "apachectl -S" para que possamos descartar a configuração incorreta.
Ezra-s
queixas mensagem de erro sobre v3 SSL, ainda na sua configuração é desativada ...
alexus
Você diz que está usando o OpenSSL 1.1.0f. É que em ambos o servidor e na máquina onde você emitiu os comandos s_client acima? Em qual plataforma seu servidor está sendo executado? Você pode querer ver se o erro ocorre com ciphersuites específicos. Por exemplo, o que acontece se você adicionar "-cipher AES128-SHA" ao final do seu comando s_client?
Matt Caswell
ninjaed: @alexus: nomes de funções e arquivos e alguns literais ssl3*e SSL3*no OpenSSL também são usados ​​para TLS (1.0 a 1.2) devido às semelhanças técnicas entre esses protocolos. user134969: 'comprimento muito curto' também nunca deve ser causado por nenhuma configuração. Se isso for repetitivo, tente obter uma s_client -debug(com RSA comum, -cipherse você não fez isso no servidor) e captura de wireshark para o mesmo evento, para que possamos olhar para os dados reais da conexão e compará-los com o que o programa vê.
Dave_thompson_085

Respostas:

8

Você não pode dizer com esse erro se o servidor está negociando SSLv3 ou TLSv1 (você pode dar uma olhada nesta questão no Unix e Linux e verificar se está desabilitado em qualquer lugar do apache ...) --- o 1.1.0f o código fonte aqui no GitHub deliberadamente desfoca os dois ...

   if (enc_err < 0) {
    /*
     * A separate 'decryption_failed' alert was introduced with TLS 1.0,
     * SSL 3.0 only has 'bad_record_mac'.  But unless a decryption
     * failure is directly visible from the ciphertext anyway, we should
     * not reveal which kind of error occurred -- this might become
     * visible to an attacker (e.g. via a logfile)
     */
    al = SSL_AD_BAD_RECORD_MAC;
    SSLerr(SSL_F_SSL3_GET_RECORD,
           SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
    goto f_err;
}

Portanto, convém reordenar seu conjunto de criptografia:

SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1

Esta postagem no askubuntu sobre a vulnerabilidade POODLE possui uma excelente lista de recursos para inspeção e canalização de SSL.

O gerador de configuração Mozilla é um excelente serviço público.

O comentário "recebendo esse erro a cada quinto clique" é um pouco estranho. Você quer dizer cliques ou toda quinta linha é uma solicitação incorreta nos logs? Tente iniciar o apache single-threaded (o sinalizador -X) e veja se isso faz a mesma coisa ... ou talvez a configuração SSLSessionTickets off.

Meu pensamento aqui é eliminar a segmentação e a coerência / consistência da sessão / cache como fonte de problemas. A execução do apache single-threaded (iniciando-o com o sinalizador -X) é uma maneira de conseguir isso, outra maneira é definir MaxClients=1(pelo menos com o modelo MPM). Os tíquetes de sessão foram uma fonte de problemas no passado com o TLSv1.2 e estão ativados por padrão; esse é o motivo por trás SSLSessionTickets off(observe que isso faz parte da mensagem "Server Hello" do SSL, não um cookie de sessão ou semelhante). O erro 'cada quinto clique' ainda me incomoda - não consigo deixar de notar que a maioria dos navegadores encaminhará quatro solicitações de recursos em uma única ...) e abrirá uma nova conexão (um novo aperto de mão ssl, etc ...) para o quinto ... sem uma captura de pacotes, é difícil dizer o que realmente está acontecendo.

Parece que você eliminou a negociação de cifras como fonte de erro (você pode duplicar a condição de erro sob especificações de cifras muito mais restritivas, a menos que eu esteja enganado). Gostaria de saber se você pode acionar o erro renegociando o SSL (apenas para chutes, digamos): openssl s_client -connect server:443e digite 'R', veja o que dizem os logs.
Veja também se o cache da sessão está funcionando com a -reconnectopção s_client.
Algo deve estar diferente nos contextos de recebimento das solicitações de SSL, e parece que a melhor maneira de descobrir isso (além de uma inspeção de byte a byte do que está acontecendo na rede, que pode ser difícil de anonimaizar), é severamente limite o tamanho do que está ouvindo (ou seja, o número de ouvintes).

Outras ferramentas de depuração que eu tentaria (assumindo que a postagem de capturas de pacotes está fora de questão ...)
- ssltap (no libnss3-toolsubuntu)
- cipherscan
- sslscan

ATUALIZAÇÃO Fazer uma cutucada
nisto através do ssltap parece muito com o ressurgimento do bug # 3712 do OpenSSL (renegociação de teclas durante a leitura / gravação, basicamente). Procurando uma solução decente que não prejudique o desempenho. Coisas divertidas!

quadruplebucky
fonte
1
Eu também brincava com declarações SSLCipherSuite mais explícitas (na linha do que a configuração do Mozilla gera), configurava o LogLevel para info ou debug, pcc do tcpdump / wireshark, etc., qualquer coisa para descobrir o que realmente está acontecendo.
Quadruplebucky #
1
Por que você não tenta uma ferramenta como o cipherscan github.com/mozilla/cipherscan ou sslscan github.com/rbsec/sslscan (também em vários repositórios ) para tentar descobrir o que realmente está acontecendo antes de regressar?
Quadruplebucky
Com SSLProtocol -SSLv3a conexão definitivamente não era SSL3. Lembre-se de que funções OpenSSL (e arquivos de origem) nomeadas com ssl3 ainda fazem parte de todos os protocolos TLS até 1.2. A exclusão de cifras SSLv3 (e TLSv1 no 1.1.0) impede realmente a negociação de qualquer protocolo abaixo do TLS1.2, mas com navegadores atualizados que devem estar bem.
Dave_thompson_085
@ user134969: para o wireshark descriptografar essas conexões (e, portanto, ajudar aqui), você precisa (temporariamente) restringir a troca de chaves ao RSA comum; isso é mais fácil do lado do Apache SSLCiphers RSA+AES. (E forneça o arquivo de chave privada do servidor em Editar / Preferências / Protocolos / SSL.) O Chrome costumava reclamar sobre o RSA comum (ou seja, não o PFS), mas eu apenas testei novamente e o meu parece estar feliz agora.
Dave_thompson_085
@quadruplebucky, você pode me indicar qual é a localização do "ssl3_record.c" no sistema?
user134969
6

Eu já vi isso antes, já tive isso antes.

A resposta no meu caso acabou sendo extremamente sutil.

O adaptador de rede ativou o TCP Segment Offloading, que devido a um bug de alguma forma estava desconcertando (ou truncando, não consigo lembrar) os últimos bytes de algumas mensagens - o que estava causando a falha do MAC nos registros SSL.

Era uma máquina virtual no VMWare.

Eu tentaria desativar o TSO / GSO / GRO em seu ambiente e ver se o problema desapareceria.

ethtool -K eth0 tso off gro off gso off ufo off
Matthew Ife
fonte
Ele retorna: Não é possível alterar o udp-fragmentation-offload
user134969
Faça o mesmo, mas omita 'ufo off'
Matthew Ife
1
Outra coisa razoavelmente burra de se procurar que pode causar truncamento de pacotes são os problemas de MTU (os jumbo-frames estão ativados quando não deveriam estar) ou a fixação do MSS necessária sobre o TCP se você enviar seus dados para um túnel.
Matthew Ife
3

Há alguma estranheza no OpenSSL e no multithreading. Qual MPM você usa? Se isso estiver relacionado a multithreading, o "prefork" deve ser seguro, enquanto "worker" e "event" podem ser afetados.

Se o seu perfil de carga permitir, talvez você possa tentar passar para o prefork e ver se o problema persiste.

Andreas Rogge
fonte
assim pelo menos multithreading está descartada :)
Andreas Rogge
0

Primeiro, verifique se o chrome está atualizado. Versões anteriores dão problemas com certas cifras. Tive esse problema com o cromo em sites comuns como a amazon etc.

Segundo, o conselho para proibir protocolos na "lista de cifras" que você seguiu é uma péssima idéia, porque não proibirá protocolos, proibirá a maioria das cifras, incluindo aquelas que funcionam "desde" SSLv3 (mas não significa que você esteja ativando o SSL3 se você permite cifras SSLv3), use uma lista mais genérica fornecida pelo gerador de configuração SSL da Mozilla para compatibilidade (observe que o SSLv2 não existe mais ou é suportado em httpd ou openssl; portanto, não há mais motivo para proibi-lo explicitamente) e talvez sua combinação anterior tenha sido muito rigorosa , tente este:

SSLProtocol             all -SSLv3
SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

Se você ainda tiver problemas, ative a depuração para SSL e veja o que o httpd tem a dizer (envie apenas uma tentativa ou duas e desative esse log, isso é muito barulhento):

LogLevel ssl:trace3

Notas de rodapé: Você também pode remover o SSLCertificateChainFile, pois essa diretiva está obsoleta na 2.4. Você pode adicionar a cadeia SSLCertificateFile e classificar todos os certificados da folha para a raiz ou alterar o SSLCertificateChainFile para SSLCACertificateFile (embora este seja usado principalmente para autenticação SSL).

Você também deve adicionar (se ainda não o fez) para adicionar:

SSLRandomSeed startup file:/dev/urandom 2048
SSLRandomSeed connect file:/dev/urandom 2048
SSLSessionCache shmcb:/path/to/log/ssl_gcache_data(512000)

Edit: Após nossa conversa, vamos recorrer à instalação do openssl e / ou se realmente é a mesma versão que o seu httpd usa:

Emita este comando e vamos ver o que diz: openssl ciphers -v 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'

Também para garantir que a versão openssl seja a correta, execute isto:

openssl version
ezra-s
fonte
Não, não resolvê-lo - verifique a minha edição, eu postei log ao usar SSL: trace3 ...
user134969
O openssl é uma versão pré-compilada ou compilada manualmente?
Ezra-s
@ user134969 Estou anexando um comando para que você possa ver se obtém cifras ou cifras suficientes de seu estoque, caso haja algum problema.
Ezra-s