SSL操作失败,错误代码为1:DH密钥太小。

13

我正在通过SSL连接到我的Google Cloud SQL数据库。我使用codeigniter 3.0来实现这一点,尽管mysqli驱动程序进行了一些修改以允许此功能。

它已经运作良好数月。然而,它刚刚开始返回这个警告:

Message: mysqli::real_connect(): SSL operation failed with code 1. OpenSSL Error messages: error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small

我认为“DH密钥太小”是主要问题,但我不知道它的含义。我已经谷歌了Diffie-Hellman密钥交换和“密钥太小”的信息,但没有找到什么有用的结果。

这是否表明服务器上的密钥已被篡改?我已检查它们的最后修改日期,没有异常的近期访问记录。

可能是我的服务器升级了PHP或它们的服务器配置,导致它无法正常工作,但我想确认一下它不是其他问题。

感谢任何关于这个主题的见解/易读材料。


2
尝试在 httpd.conf 文件中更改 SSLCipherSuite。 - codex
1个回答

15
... error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small
您感兴趣的错误编号是OpenSSL错误0x14082174。 SSL3_CHECK_CERT_AND_ALGORITHM通常在启用导出级密码时出现。由于Logjam(请参见下文),它可能再次出现在非导出级别协商中。
我假设DH密钥太小是主要问题,但我不知道这是什么意思。我已经搜索了Diffie-Hellman密钥交换,以及"key too small"信息,但没有找到很多有用的信息。
这是由最近的Logjam攻击引起的,该攻击来自于Imperfect Forward Secrecy: How Diffie-Hellman Fails in Practice
您应该使用2048位Diffie-Hellman组或更大的组。您不应该使用512位或1024位Diffie-Hellman组。
第一件要检查的事情是您的密码列表字符串。它应该类似于:
"HIGH:!aNULL:!MD5:!RC4"

它将避免使用出口级别的密码,并使用现代密码。但您还需要确保DH回调未使用弱/小字段大小。为此,您需要检查服务器配置。


一些人正在使用kRSA来“解决”问题。kRSA是一种密钥传输方案,而不是密钥协商方案。RSA密钥传输方案不提供前向保密性,其使用通常被反对。事实上,它将从TLS 1.3中删除。

我只能说“通常不鼓励使用”,因为这取决于要保护的数据。如果您使用SSL/TLS来保护公开可用文件的下载,则可能可以使用它。如果您的网站有登录,则使用它可能有一定的风险,因为密码是机密数据(不像公开可下载文件)。

为避免密钥传输并通过Qualsys SSL Labs测试的Web服务器配置和前向保密,请使用:

"HIGH:!aNULL:!kRSA:!MD5:!RC4"
在您的Apache配置文件中,它看起来像这样:
# cat /etc/httpd/conf.d/ssl.conf | grep SSLCipherSuite
# SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
SSLCipherSuite HIGH:!aNULL:!kRSA:!MD5:!RC4

我记得在那篇论文发布之前不久,wget 就拒绝了小组。这可能是你网站的一个好测试案例。

还有一个更好的sslscan,可以测试很多东西。这也可能是一个好的 QA 工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接