将项目从PHP 5.6移动到PHP 7时,我遇到一个奇怪的问题,我有一个数据库类,允许您在调用mysqli_init();
之后和调用mysqli_real_connect()
之前设置与数据库的SSL连接
我一直在PHP 5.6上开发它,并且已成功创建到远程服务器的SSL连接,并且一切正常,远程数据库服务器不使用自签名证书。
在我的db类的setSSL
方法中,我有这个:
if($verify) { $this->mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); }
$this->mysqli->ssl_set($key, $cert, $ca, $capath, $ciphers);
该方法将$verify
设置为默认设置true
,保持原样,证书包通过变量$ca
传递。
这在PHP 5.6上运行良好,并且正是应该做的,并确认连接确实使用了SSL连接。
在同一台服务器上,我创建了一个子域并将其设置为使用PHP 7(我听说性能要好得多,我的代码是PHP 7友好的。)
我在新的子域上完成了我的代码的完整副本,除了远程SSL mysqli连接外,一切正常。
我已经检查了PHP 7中删除的功能以及许多其他内容,但无法找出原因。
日志摘录:
[Msg:mysqli :: real_connect():SSL操作失败,代码为1。 OpenSSL错误消息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败]
[Msg:mysqli :: real_connect():无法使用SSL连接到MySQL]
[Msg:mysqli :: real_connect():[2002](尝试通过连接 TCP://******.co.uk:3306)]
另一方面,如果我没有通过ca证书捆绑包,那么当我第一次在PHP 5.6上开发此功能时,会产生同样的错误。
答案 0 :(得分:1)
我99%肯定这是因为您使用链式证书(这是常见的)和MySQL目前does not support chained certificates(这很烦人)。
您通常不将中间证书加载到客户端证书池中,因为这会降低安全性并且是许多网络服务器所有者常常犯的错误。 但由于没有其他关于MySQL的解决方案,您可能只想这样做 这一点。
因此,作为一种解决方法,请尝试将CA 和所有中间证书加载到PHP的证书池中 - 请记住这是不好的做法。
<强>更新强>
我认为这个漏洞很久以前就得到了解决,但是MySQL团队并没有更新他们的故障单......根据你的MySQL(通常是openssl)中的哪个ssl库它应该已经可以工作了。
在此处阅读如何连接和构建正确的证书链:How to chain a SSL certificate