我收到错误消息:SSL3_GET_RECORD:解密失败或mac记录错误


7

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

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

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

编辑:

如果我尝试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:

另一个编辑:

正如@quadruplebucky所建议的,我将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到我的virtualhost 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

编辑:

将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

我没有错误吗?

如果我将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()

因此,在此之后将发生相同的错误:

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

openssl version
OpenSSL 1.1.0f  25 May 2017

任何端点配置错误都不可能导致“错误的解密或mac”(警报20)。这些客户端与该服务器之间的网络中是否有任何内容,例如防火墙,IDS,IPS,DLP甚至是“智能”路由器?您是否可以重复测试(因为这可能取决于数据,因此是准随机的)从服务器本身或与服务器位于同一网段的计算机进行连接?
dave_thompson_085

显示* .443虚拟主机(如果需要,整个虚拟主机)的相关内容,以及“ apachectl -S”的输出,因此我们可以丢弃错误的配置。
ezra-s

关于SSL v3的错误消息投诉,但是在您的配置中它已被禁用...
alexus

您说您正在使用OpenSSL 1.1.0f。是,在这两个服务器并在您发出上述命令的s_client.First机器上?您的服务器在哪个平台上运行?您可能想查看特定的密码套件是否发生错误,例如,如果在s_client命令的末尾添加“ -cipher AES128-SHA”会发生什么?
马特·卡斯威尔

ninjaed:@alexus:函数文件名以及一些文字ssl3*SSL3*OpenSSL中的内容也用于TLS(1.0到1.2),因为这些协议之间的技术相似。user134969:“长度太短”也绝不应由任何配置引起。如果这是可重复的,请尝试为同一事件获取一个s_client -debug(使用纯RSA,-cipher如果您未在服务器上执行此操作)和Wireshark捕获以便我们查看实际的有线数据并将其与程序看到的进行比较。
dave_thompson_085

Answers:


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

因此,您可能需要重新排序密码套件:

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

在Askubuntu上有关POODLE漏洞的这篇文章有一个很棒的SSL检查和管道资源列表。

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

“每五次点击都会收到此错误”注释有点奇怪。您是说单击还是在日志中每五行是一个错误的请求?尝试启动apache单线程(-X标志),看看是否做同样的事情……或者也许是setting SSLSessionTickets off

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

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

其他调试工具我想尝试(假设发布数据包捕获是出了问题....)
- ssltap(在libnss3-toolsUbuntu上)
- cipherscan
- sslscan

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


1
我还将使用更明确的SSLCipherSuite声明(沿着Mozilla配置生成的代码行),将LogLevel设置为info或debug,将tcpdump / wireshark pcaps设置为等等,以了解实际情况。
quadruplebucky

1
您为什么不尝试使用诸如cipherscan github.com/mozilla/cipherscan或sslscan github.com/rbsec/sslscan(也在许多存储库中)之类的工具来尝试找出回归之前的实际情况?
quadruplebucky

SSLProtocol -SSLv3连接肯定不是SSL3。请记住,在OpenSSL中,以ssl3命名的函数(和源文件)仍然是所有TLS协议(直到1.2)的一部分。删除SSLv3(和仅1.1.0中的TLSv1)密码实际上会阻止协商TLS1.2以下的任何协议,但是使用最新的浏览器应该可以。
dave_thompson_085

@ user134969:为了使wireshark解密这些连接(从而在这里有所帮助),您需要(暂时)将密钥交换限制为纯RSA;这在Apache方面最容易做到SSLCiphers RSA+AES。(并在Edit / Preferences / Protocols / SSL中提供服务器私钥文件。)Chrome过去曾抱怨纯RSA(即不是 PFS),但我只是重新测试过,我的现在似乎很高兴。
dave_thompson_085

@quadruplebucky您能指出我“ ssl3_record.c”在系统中的位置是什么吗?
user134969

6

我以前看过这个,实际上以前看过。

在我看来,答案非常微妙。

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

它是VMWare上的虚拟机。

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

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

它返回:无法更改udp-fragmentation-offload
user134969 '17

进行相同的操作,但是忽略“ ufo off”
马修·伊夫

1
另一个可能导致数据包截断的合理愚蠢的事情是MTU问题(不应在应有的时间打开巨型帧)或通过隧道发送数据时需要通过TCP进行MSS钳制。
马修·伊夫

3

OpenSSL和多线程技术有些奇怪。您使用什么MPM?如果这与多线程相关,则“ prefork”应该是安全的,而“ worker”和“ event”可能会受到影响。

如果您的负载配置文件允许,则可以尝试切换到前叉,然后查看问题是否仍然存在。


因此至少要排除多线程处理:)
Andreas Rogge

0

首先,请确保Chrome已更新。较旧的版本会给某些密码带来问题。我本人曾在亚马逊等常见站点遇到过铬的问题。

其次,关于遵循“密码列表”中的协议的建议是一个非常糟糕的主意,因为它不会禁止协议,它将禁止大多数密码,包括那些自“ SSLv3起”使用的密码(但这并不意味着您可以启用SSL3)您允许使用SSLv3密码),请使用Mozilla SSL配置生成器提供的更为通用的列表以实现兼容性(请注意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

如果仍然有问题,请启用SSL调试并查看httpd的内容(仅发送一两次尝试,然后禁用此日志记录,这太吵了):

LogLevel ssl:trace3

旁注:您也可以继续删除SSLCertificateChainFile,因为该指令在2.4中已弃用。您可以添加SSLCertificateFile链并将所有证书从叶子到根进行排序,甚至可以将SSLCertificateChainFile更改为SSLCACertificateFile(尽管此证书主要用于SSL身份验证)。

您还应该添加(如果尚未添加)以添加:

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版本是正确的版本,请运行以下命令:

openssl version

不,没有解决问题-检查我的编辑,使用ssl:trace3 ...时我发布了日志
user134969

是openssl预编译还是手动编译的版本?
ezra-s

@ user134969我要附加一条命令,以便您可以查看是否从存有的opensl中获取了密码或密码是否足够。
ezra-s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.