Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正确的连接顺序和ssl实现;“握手不好”;_Php_Mysql_Ssl_Pdo - Fatal编程技术网

Php 正确的连接顺序和ssl实现;“握手不好”;

Php 正确的连接顺序和ssl实现;“握手不好”;,php,mysql,ssl,pdo,Php,Mysql,Ssl,Pdo,注意:我在键入此问题时解决了一段时间以来遇到的问题,我想知道我的解决方案是否正确 我的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,

注意:我在键入此问题时解决了一段时间以来遇到的问题,我想知道我的解决方案是否正确

我的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。

第二个片段告诉我,您的服务器没有配置/运行证书。这就是握手不好的原因

当您启动到MySQL的SSL连接(使用第一个代码段)时,客户端和服务器都需要完全配置才能这样做。在MySQL上,这包括SSL证书、CA证书等。这是通过CLI完成的。这通常使用
--sslca
--ssl cert
--ssl key
mysqld
命令行参数来完成

您的第一个代码段失败,因为MySQL没有返回有效的SSL握手

您的第二个代码段正在工作,因为您的mysqli SSL集是在连接已经发生之后发生的,即它没有任何效果。连接实际上已经下降到非SSL


考虑为
mysqld
生成一个证书,用正确的参数重新启动它,看看这是否有效。

SSL只保护PHP和MySQL之间的通信不被窃听者截获。当连接到
localhost
上的MySQL服务器时,它是完全没有意义的(如果通过套接字/命名管道可以访问服务器,则很可能会被忽略)。我的密码也不是密码,而且文件的路径也不是
path/
,这很清楚。没有任何区别。