我收到错误:SSL3_GET_RECORD:解密失败或错误的loggingmac

我有我自己的服务器(我正在运行Apache/2.4.27 ),今天我意识到,从(勇敢和谷歌浏览器 – 不同的电脑),我从我的网站得到这个错误;

 This site can't provide a secure connection mywebsite.com sent an invalid response. ERR_SSL_PROTOCOL_ERROR 

而奇怪的是,我每五次点击我的网站就会出现这个错误。

从我的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 

options-ssl-apache.conf ;

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

我已经从网站检查日志文件,但没有,也没有在这里; /var/log/apache2/error.log

我试图找出是什么导致这个错误,任何想法在哪里可以find更多的信息,甚至更好,如何解决这个问题?

编辑:

如果我尝试openssl s_client -connect mywebsite.com:443 ,它将返回:

我正在使用: 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: 

另一编辑:

正如@quadruplebuckybuild议我把options-ssl-apache.conf改成:

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

我还尝试将SSLProtocol all -SSLv2 -SSLv3添加到我的虚拟主机configuration文件中,同时我也在这里更改了几个参数。 /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 

编辑:

将LogLevel更改为Info ,将返回:

 [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) 

编辑:

如果我使用选项-crlf运行,如下所示:

 openssl s_client -crlf -connect mywebsite:443 

我没有得到任何错误?

还有一件事,如果我改变LogLeveldebugging,之前,我得到这个错误:

 [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() 

所以在这之后也会发生同样的错误:

 SSL Library Error: error:140940F4:SSL routines:ssl3_read_bytes:unexpected message openssl version OpenSSL 1.1.0f 25 May 2017 

我以前见过这个,实际上之前有过这个。

我的答案最终是非常微妙的。

networking适​​配器启用了TCP Segment Offloading,这是由于某种forms的错误导致某些消息的最后几个字节发生改变(或者截断,不能记住) – 这导致SSLlogging上的MAC失败。

这是VMWare上的虚拟机。

我会尝试在您的环境中禁用TSO / GSO / GRO,并查看问题是否消失。

 ethtool -K eth0 tso off gro off gso off ufo off 

如果你的服务器正在协商SSLv3或TLSv1,你不能从这个错误中知道(你可能想在Unix和Linux上看看这个问题,并确保它在Apache的任何地方都是禁用的…)— 1.1.0f GitHub上的源代码故意模糊了这两个…

  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 (eg 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; } 

所以你可能想重新安排你的密码套件:

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

关于POODLE漏洞的askubuntu上的这个post有一个很好的SSL检查和pipe道资源列表。

Mozillaconfiguration生成器是一个很好的公共服务。

“每获得一次这个错误点击”评论有点奇怪。 你的意思是点击 ,或者每五行都是日志中的错误请求? 尝试启动Apache的单线程(-X标志),看看是否做同样的事情…或者也许设置SSLSessionTickets off

我的想法是消除线程和会话/caching一致性/一致性作为麻烦来源。 运行apache单线程(使用-X标志启动它)是完成此操作的一种方法,另一种方法是将MaxClients=1设置MaxClients=1 (至less使用MPM模型)。 会话票据过去一直是TLSv1.2的麻烦来源,并且默认情况下它们是启用的,这是SSLSessionTickets off的原因(请注意,这是SSL“Server Hello”消息的一部分,不是会话cookie或类似的) 。 “每五分之一点击”错误仍然困扰着我 – 我不禁会注意到,大多数浏览器将在一个单一的pipe道四个资源请求…),并打开一个新的连接(一个新的SSL握手等…)对于第五…没有数据包捕获很难说实际上是怎么回事。

看来你已经消除了密码协商作为错误的来源(你可以在更严格的密码规范下复制错误条件,除非我错了)。 我会很好奇,知道你是否可以通过重新谈判SSL来触发错误(只是踢脚踢): openssl s_client -connect server:443 ,然后input'R',看看日志说什么。
另请参阅会话caching是否正在使用s_client的-reconnect选项。
对于SSL请求的接收上下文来说,一定是不一样的,看起来最好的办法就是对这个问题进行parsing(对每一个字节的检查,这对于匿名来说可能很难)限制了监听的大小(即监听者的数量)。

其他debugging工具,我会尝试(假设张贴数据包捕获是不可能的….)
– ssltap (在Ubuntu的libnss3-tools中)
– cipherscan
– sslscan

UPDATE
通过ssltap戳这个看起来非常像OpenSSL bug#3712重新出现 (基本上在读/写过程中的关键重新协商)。 寻找一个体面的解决方法,不会杀死性能。 好玩的东西!

OpenSSL和multithreading有一些不可思议的地方。 你用什么MPM? 如果这是multithreading相关的,则“prefork”应该是安全的,而“worker”和“event”可能会受到影响。

如果您的负载configuration文件允许它也许你可以尝试切换到prefork,看看问题是否依然存在。

首先确保chrome更新。 旧版本会给某些密码带来问题。 与铬本身的问题,像亚马逊等常见的网站

其次,禁止使用“encryption列表”中的协议的build议是一个非常糟糕的主意,因为它不禁止协议,它将禁止大多数密码,包括那些自“SSLv3以来”起作用的密码(但并不意味着您正在启用SSL3 if您允许使用SSLv3密码),使用Mozilla SSLconfiguration生成器提供的更为简单的列表来兼容(请注意,SSLv2不再存在,或者在httpd或openssl中不受支持,所以没有理由再明确禁止),也许您之前的组合太严格,试试这个:

 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 

如果您仍然遇到问题,请启用SSLdebugging并查看httpd的说明(只发送1或2个,并禁用此日志logging,这太吵了):

 LogLevel ssl:trace3 

注意:您也可以继续并删除SSLCertificateChainFile,因为该指令在2.4中不推荐使用。 您可以添加SSLCertificateFile链,并将所有的证书从叶到根,或者甚至将SSLCertificateChainFile更改为SSLCACertificateFile(虽然这个主要用于SSL auth)。

你还应该添加(如果你还没有)添加:

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

编辑:在我们的谈话之后,让我们来检查openssl安装和/或如果它确实是你的httpd使用的相同的版本:

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'发出该命令并让我们看看它是什么说的: 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'

也要确保openssl版本是正确的运行这个:

 openssl version