我通过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工具。