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 -SSLv3
ao 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, 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 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
fonte
ssl3*
eSSL3*
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 umas_client -debug
(com RSA comum,-cipher
se 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ê.Respostas:
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 ...
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ásSSLSessionTickets 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:443
e digite 'R', veja o que dizem os logs.Veja também se o cache da sessão está funcionando com a
-reconnect
opçã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-tools
ubuntu)- 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!
fonte
SSLProtocol -SSLv3
a 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.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.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.
fonte
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.
fonte
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:
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):
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:
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:
fonte