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

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

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

This site can’t provide a secure connection

mywebsite.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

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

从我的配置文件中:

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 25 May 2017

CONNECTED(00000003)

...

3073276480:error:1408F119:SSL routines:ssl3_get_record:decryption failed or bad record mac:../ssl/record/ssl3_record.c:469:

此外,如果我将 SSLProtocol 更改为SSLProtocol -ALL +TLSv1 +TLSv1.1 +TLSv1.2,它将返回相同的错误。

另一项编辑:

正如有人建议的那样,我将 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到我的虚拟主机 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)

仍在寻找灵魂...

答案1

所以,这里有几件事,现在你将试图只使用最现代的安全密码和协议,从而让自己陷入深渊。

首先,您的 SSL 密码。通过执行此操作,!SSL3!TLS1将禁用每一个支持的 TLS 密码;此外,通过仅选择您指定的四种密码,您还禁止使用其他与 TLS1.2 兼容的密码,这些密码可能比 TLS1.2 与 LE 和其他服务更“兼容”。(如果您无法协商,他们仍然会返回您看到的错误代码,这是一个标准错误消息,而不是一定正在尝试 SSLv2 或 SSLv3 的指标。

其次,您的 SSL 协议。虽然它伟大的要禁用 SSLv2、SSLv3、TLSv1 和 TLSv1.1,很多东西都没有“更新”以仅支持您选择的 TLSv2 密码。因此,您应该提供一组更“传统”的协议和密码,以便一切都能正常通信。特别是如果您在服务器或端点系统上使用 14.04(基于您现在在 Ask Ubuntu 上删除的帖子),因为该系统上的 OpenSSL 已经过时了。(不,您的问题与此无关SSLv3)。

我相当喜欢Mozilla 的 SSL 配置生成器,但我也很喜欢使用Cipherli.st 的配置第二个提供了一组“旧”的 SSL 配置,如下所示(注意:此列表不是最新的,我建议您参考 Mozilla 的 SSL 配置生成器或 Cipherli.st 以获取更新的“旧”选项,尽管 TLS1.1 及更低版本现在被 Mozilla 视为“旧”版本):

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4 
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4 
SSLCompression off
SSLSessionTickets Off 
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

请注意,我倾向于将这些遗留的东西用于我的一些较旧的 Android 设备,以便它们可以查看我的 Web 服务(NGINX 服务,而不是 Apache,但有同样的区别)。

如果你真的想要像您尝试的那样推出超强化安全性(仅限 TLSv1.2 和非常非常强大的密码),您应该考虑到互联网的很大一部分和许多物联网设备将无法访问您的网站或服务。 LetsEncrypt 可能包含在此列表中。这就是为什么使用中级(Mozilla)或旧版(Cipherli.st)密码集和协议设置是“可以的”的原因。它可能无法让您在 SSLLabs 上获得超高的 100% 全面 SSL 分数,但它将要让您在选择使用的网站上获得 A+。


另一个考虑点是,我认为您所选择的基于 DH 的密码缺少一些关键部分。您需要定义一个 DH 参数文件。Apache 的弊端使得启用此功能有点困难。您基本上需要生成一个 2048 位或更强的 DH 参数文件,然后将其添加到 SSL 证书的末尾。 openssl dhparam 2048 >> /path/to/site/certificate应该这样做,但您可能希望在用户可写空间中复制证书,以确保正确编辑文件。(然后将该文件移回具有另一个名称的目录以指示它具有 DHParam,然后使用它)。

答案2

我不得不将 Apache 降级到 2.4.7,但它仍然运行良好。

相关内容