Estou recebendo o erro: SSL3_GET_RECORD: decryption failed or bad record mac

8

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

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

E o mais estranho é que estou recebendo este erro a cada cinco cliques 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 usando: 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 @quadruplebucky sugeriu que eu alterasse as opções-ssl-apache.conf em:

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

#SSLSessionTickets       off

Eu também tentei adicionar SSLProtocol all -SSLv2 -SSLv3 no meu arquivo conf virtualhost e, ao mesmo tempo, alterei 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 para Info , ele 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 correr com a opção -crlf, assim:

openssl s_client -crlf -connect mywebsite:443

Não estou cometer erros?

Só mais uma coisa se eu alterar o LogLevel para depurar, antes desse erro eu estou recebendo isso:

[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 acontecerá:

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

openssl version
OpenSSL 1.1.0f  25 May 2017
    
por user134969 07.07.2017 / 22:28

4 respostas

8

Você não pode dizer a partir desse erro se o seu servidor está negociando SSLv3 ou TLSv1  (você pode querer dar uma olhada em esta questão no Unix & Linux e verifique se ele está desativado em todos os lugares no apache ...) --- o código-fonte 1.1.0f aqui no GitHub deliberadamente desfaz 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;
}

Então, você pode querer reordenar seu conjunto de criptografia:

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

Este post no askubuntu sobre o POODLE vulnerabilidade tem uma excelente lista de recursos para inspeção e encanamento SSL.

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

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

Meu pensamento aqui é eliminar a coerência / consistência de threads / sessões / cache como fonte de problemas. Executar o single-threaded do apache (iniciando-o com o sinalizador -X) é uma maneira de realizar isso, outra maneira é definir MaxClients=1 (pelo menos com o modelo MPM). Os tickets de sessão têm sido uma fonte de problemas no passado com o TLSv1.2 e eles estão habilitados por padrão, este é o raciocínio por trás do SSLSessionTickets off (note que isso é parte da mensagem SSL "Server Hello", não um cookie de sessão ou similar ). O erro 'cada quinto clique' ainda me incomoda - não posso deixar de notar que a maioria dos navegadores irá enviar quatro solicitações de recursos em um único ...) e abrir uma nova conexão (um novo handshake 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 criptografia como uma fonte de erro (é possível duplicar a condição de erro sob especificações de criptografia muito mais restritivas, a menos que eu esteja enganado). Eu ficaria curioso para saber se você pode acionar o erro renegociando SSL (apenas para pontapés, digamos): openssl s_client -connect server:443 e, em seguida, digite 'R', ver o que dizem os registros. Também ver se o cache de sessão está trabalhando com a opção -reconnect para s_client.
Algo deve ser diferente sobre os contextos de recebimento para as solicitações SSL, e parece ser a melhor maneira de descobrir isso (menos de um byte-by-byte) a inspeção do que está acontecendo com o fio, que pode ser difícil de anonimizar) é limitar severamente o tamanho do que está ouvindo (ou seja, o número de ouvintes).

Outras ferramentas de depuração que eu tentaria (supondo que a postagem de capturas de pacote esteja fora de questão ...)
    - ssltap (em libnss3-tools no ubuntu)
    - cipherscan
    - sslscan

UPDATE
Dar uma olhada nisso por meio de ssltap parece muito com erro do OpenSSL # 3712 ressurgiu (renegociação de chave durante a leitura / gravação, basicamente). Procurando por uma solução alternativa decente que não mate o desempenho. Coisas divertidas!

    
por 08.07.2017 / 03:24
6

Eu já vi isso antes, antes disso, na verdade.

A resposta no meu caso acabou sendo extremamente sutil.

O adaptador de rede habilitou o TCP Segment Offloading, que devido a um bug de alguma forma estava mutilando (ou truncando, não consigo lembrar) os últimos bytes de algumas mensagens - que estavam subseqüentemente fazendo com que o MAC nos registros SSL falhasse.

Era uma máquina virtual no VMWare.

Eu tentaria desabilitar o TSO / GSO / GRO em seu ambiente e ver se o problema desaparece.

ethtool -K eth0 tso off gro off gso off ufo off
    
por 10.07.2017 / 13:59
3

Existe alguma estranheza com o OpenSSL e o multithreading. Qual MPM você usa? Se isso for 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 mudar para o prefork e ver se o problema persiste.

    
por 11.07.2017 / 23:35
1

Primeiro, verifique se o Chrome está atualizado. Versões mais antigas dão problemas com certas cifras. Teve esse problema com o cromo-me com sites comuns como amazon, etc.

Em segundo lugar, o conselho para proibir protocolos em "lista de cifra" que você seguiu é uma idéia muito ruim porque não proibirá protocolos, proibirá a maioria dos cifras incluindo aqueles que funcionam "desde" SSLv3 (mas não significa que você é ativando o SSL3 se você permitir cifras SSLv3), use uma lista mais genérica fornecida pelo Mozilla SSL config generator para compatibilidade (note que o SSLv2 não existe mais ou é suportado no httpd ou openssl, portanto nenhuma razão para proibi-lo explicitamente) e talvez sua combinação anterior foi muito rigoroso, 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 1 ou 2 tentativas e desative este log, isso é muito barulhento):

LogLevel ssl:trace3

Sidenotes: Você também pode ir em frente e remover o SSLCertificateChainFile, já que essa diretiva está obsoleta em 2.4. Você pode adicionar a cadeia SSLCertificateFile e classificar todos os certificados de folha para raiz, ou até mesmo alterar SSLCertificateChainFile para SSLCACertificateFile (embora este seja usado principalmente para autenticação SSL).

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

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

Editar: Após a nossa conversa, vamos recorrer para verificar a 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 ele 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'

Além disso, para garantir que a versão openssl seja a correta, execute o seguinte:

openssl version
    
por 10.07.2017 / 14:39