我收到错误:SSL3_GET_RECORD:decryption failed or bad record mac

use*_*969 8 ssl apache-2.4

我有自己的服务器(我正在运行Apache/2.4.27),今天我意识到从(Brave 和 Google Chrome - 不同的计算机)我从我的网站收到这个错误;

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR
Run Code Online (Sandbox Code Playgroud)

奇怪的是,我在我的网站上每点击五次就会收到这个错误。

从我的 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
Run Code Online (Sandbox Code Playgroud)

来自options-ssl-apache.conf;

SSLProtocol             all -SSLv2 -SSLv3
SSLCipherSuite          EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLHonorCipherOrder     on
SSLCompression          off
Run Code Online (Sandbox Code Playgroud)

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

我试图找出导致此错误的原因,任何想法在哪里可以找到更多信息甚至更好,如何解决此问题?

编辑:

如果我尝试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:
Run Code Online (Sandbox Code Playgroud)

另一个编辑:

正如@quadruplebucky 建议我将 options-ssl-apache.conf 更改为:

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

#SSLSessionTickets       off
Run Code Online (Sandbox Code Playgroud)

我还尝试添加SSLProtocol all -SSLv2 -SSLv3到我的虚拟主机 conf 文件中,同时我在这里做了几件事情;/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
Run Code Online (Sandbox Code Playgroud)

编辑:

将 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)
Run Code Online (Sandbox Code Playgroud)

编辑:

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

openssl s_client -crlf -connect mywebsite:443
Run Code Online (Sandbox Code Playgroud)

我没有错误?

如果我将 LogLevel 更改为调试,还有一件事,在该错误之前,我会收到以下信息:

[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()
Run Code Online (Sandbox Code Playgroud)

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

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

openssl version
OpenSSL 1.1.0f  25 May 2017
Run Code Online (Sandbox Code Playgroud)

qua*_*cky 8

您无法从该错误中判断您的服务器是否正在协商 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 (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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

这篇关于 POODLE 漏洞的关于 askubuntu 的帖子有一个很好的 SSL 检查和管道资源列表。

Mozilla 配置生成器是一项出色的公共服务。

“每五次点击就会出现此错误”评论有点奇怪。你的意思是clicks,或者每五行是日志中的一个错误请求?尝试启动 apache 单线程(-X 标志),看看它是否做同样的事情......或者可能设置SSLSessionTickets off.

我的想法是消除线程和会话/缓存一致性/一致性作为问题的根源。运行 apache 单线程(以 -X 标志启动)是实现此目的的一种方法,另一种方法是设置MaxClients=1(至少使用 MPM 模型)。会话票证过去一直是 TLSv1.2 的麻烦来源,默认情况下它们是启用的,这就是背后的原因SSLSessionTickets off(请注意,这是 SSL“服务器问候”消息的一部分,而不是会话 cookie 或类似消息)。“每五次点击”错误仍然困扰着我 - 我不禁注意到大多数浏览器将在一个单一的管道中传输四个资源请求......)并打开一个新连接(一个新的 ssl 握手等......)对于第五个......没有数据包捕获很难说实际发生了什么。

您似乎已经消除了密码协商作为错误来源的问题(除非我弄错了,否则您可以在更严格的密码规范下复制错误条件)。我很想知道您是否可以通过重新协商 SSL 来触发错误(只是为了踢球,比如说): openssl s_client -connect server:443然后输入“R”,看看日志说了什么。
还要查看会话缓存是否与-reconnects_client 选项一起工作。
东西必须是有关为SSL请求接收环境不同,它似乎身材的最佳方式表示出来(短是怎么回事了线的逐字节的检查,这可能是艰难隐匿)是严重限制正在收听的内容的大小(即收听者的数量)。

我会尝试的其他调试工具(假设发布数据包捕获是不可能的......)
- ssltap(在libnss3-toolsubuntu 中)
- cipherscan
- sslscan

更新
通过ssltap 戳这个看起来很像重新出现的 OpenSSL 错误 #3712(基本上是读/写期间的密钥重新协商)。寻找一个不会影响性能的体面的解决方法。好玩的东西!


Mat*_*Ife 6

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

在我的案例中,答案最终非常微妙。

网络适​​配器启用了 TCP Segment Offloading,这是由于某种形式的错误正在处理(或截断,不记得)某些消息的最后几个字节 - 这随后导致 SSL 记录上的 MAC 失败。

它是 VMWare 上的虚拟机。

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

ethtool -K eth0 tso off gro off gso off ufo off
Run Code Online (Sandbox Code Playgroud)

  • 另一个可能导致数据包截断的相当愚蠢的事情是 MTU 问题(巨帧在不应该出现的时候打开)或如果您通过隧道发送数据则需要通过 TCP 进行 MSS 钳制。 (2认同)