注意:我在解决这个问题时解决了我一直有的问题,我想知道我的解决方案
我的sql数据库连接出现“坏握手”错误。它是在我尝试实现最近安装的ssl时开始的。我从以下代码开始:
$init =mysqli_init();
$key="path/ftpd-rsa-key.pem";
$cert="path/ftpd-rsa.pem";
$ca="path/cert.pem";
mysqli_ssl_set($init, $key, $cert, $ca, NULL, NULL);
//This line was my original connection script, which was working.
//$connection = mysqli_connect("localhost", "username", "password", "database") or die(mysqli_connection_error());
if(!$connection = mysqli_real_connect($init,"localhost", "username", "password", "database"))
{
die("Connect Error: " . mysqli_connect_error());
}
我尝试了各种其他方面,包括PDO,重建Apache,以及切换ssl证书和密钥等内容。什么都没有奏效。最后我尝试回到我正在使用的原始代码,然后实现ssl:
$connection = mysqli_connect("localhost", "username", "password", "database") or die(mysqli_connection_error());
$key="path/ftpd-rsa-key.pem";
$cert="path/ftpd-rsa.pem";
$ca="path/cert.pem";
mysqli_ssl_set($connection, $key, $cert, $ca, NULL, NULL);
令我惊讶的是,这很有效。我的页面现在看起来完全正常,没有“坏握手”错误。但是,由于我没有找到任何教程或材料以这种方式构建它,我想知道这是否真的是安全的。 ssl的全部意义在于安全性,并且这样做就可以在没有ssl的情况下启动连接。这是一个问题吗?
此外,任何有关“坏握手”错误的信息及其原因都是有用的。如果我们可以创建/链接指南或它的完整解释以及导致它的原因,那对未来的程序员来说是有用的,因为我在谷歌搜索时发现的建议解决方案包括从服务器切换到切换到PDO到降级的MySQL。
答案 0 :(得分:2)
第二个片段告诉我您的服务器未配置/运行证书。这是握手不良的根源。
当您启动与MySQL的SSL连接(使用您的第一个代码段)时,客户端和服务器都需要完全配置才能执行此操作。在MySQL上,这包括SSL证书,CA证书等。这是通过CLI完成的。这通常使用--ssl-ca
,--ssl-cert
和--ssl-key
mysqld
命令行参数完成。
您的第一个代码段失败,因为MySQL没有因此而返回有效的SSL握手。
您的第二个代码段正在运行,因为您的mysqli SSL设置在连接已经发生后发生 - 即它没有任何效果。连接已经有效地降低到非SSL。
考虑为mysqld
生成证书,使用适当的参数重新启动它,并查看是否有效。