SSL操作失败,代码1:dh密钥太小


SSL operation failed with code 1: dh key too small

我通过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 Key is too small是主要问题,但我不知道这意味着什么。我在谷歌上搜索了迪菲-赫尔曼密钥交换,还有"密钥太小"的信息,但我没有多少运气。

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

这可能是我的服务器做了一些升级到PHP或他们的服务器配置,这可能会导致这个中断,但我想检查并确保它不是别的东西。

感谢您提供的有关该主题的见解/可读材料。

... error:14082174:SSL routines:SSL3_CHECK_CERT_AND_ALGORITHM:dh key too small

您感兴趣的错误号是OpenSSL错误0x14082174。

SSL3_CHECK_CERT_AND_ALGORITHM通常在启用出口级密码时出现。由于僵局,它可能会在非出口级谈判中再次出现(见下文)。


我假设DH键太小是主要问题,但我不知道这意味着什么。我在谷歌上搜索了迪菲-赫尔曼密钥交换,还有"密钥太小"的信息,但我没有多少运气。

这是由于最近的"不完美前向保密:Diffie-Hellman在实践中是如何失败的"论文中的僵局攻击。

应该使用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工具。