PHP到MySQL的SSL连接

Cod*_*ris 3 php mysql ssl mysqli

我已经在一个网络上的一台服务器上成功设置了一个启用SSL的MySQL安装,并且可以使用SSL在不同网络上的另一台服务器上使用Linux命令行mysql客户端连接到它,但每次我尝试连接时(使用PHP 5.3) .3)我一直得到:

警告:mysqli_real_connect():( HY000/2026):第18行/var/www/html/test.php中的SSL连接错误

我的PHP如下,我做错了什么?证书是777(仅在测试时),相同的代码适用于不同用户的未加密连接(SSL设置被注释掉,即mysqli一般可以肯定地连接到数据库)

<?php

error_reporting(E_ALL);
ini_set("display_errors", "1");

$obj = mysqli_init();

mysqli_options($obj, MYSQLI_OPT_CONNECT_TIMEOUT, 5);

mysqli_ssl_set($obj,
               '/mysql-ssl-certs/server-key.pem',
               '/mysql-ssl-certs/server-cert.pem',
               '/mysql-ssl-certs/ca-cert.pem',
               NULL,
               NULL);

$link = mysqli_real_connect($obj, 'localhost', 'ssluser', 'some_password', 'test');

if (!$link)
{
    die('<br /><br />Connect Error (' . mysqli_connect_errno() . ') '.mysqli_connect_error());
}

echo 'Success... ' . mysqli_get_host_info($obj) . "\n";

$obj->close();

?>
Run Code Online (Sandbox Code Playgroud)

Bru*_*uno 7

这里PHP(和mysqli_real_connect)是客户端而不是服务器.您正在配置它以mysqli_ssl_set进行客户端证书身份验证(并使用服务器密钥和证书).

我不确定你是如何配置你的MySQL服务器的,但在配置的(MySQL)服务器部分应该有这样的东西:

ssl-key=/mysql-ssl-certs/server-key.pem
ssl-cert=/mysql-ssl-certs/server-cert.pem
ssl-ca=/mysql-ssl-certs/ca-cert.pem
Run Code Online (Sandbox Code Playgroud)

这些不属于客户端(只有CA证书,但绝对不是服务器的私钥).

完成此操作后,您可以尝试使用命令行客户端查看服务器是否已正确配置:

mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
Run Code Online (Sandbox Code Playgroud)

或者这个(尽管验证服务器证书应该真正启用SSL/TLS才有用)

mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
Run Code Online (Sandbox Code Playgroud)

这应该至少在命令行上起作用.

然后,从PHP中,您将获得两个选项:

  • 使用mysqli_ssl_set就像你已经完成,但离开$key$certnull,除非你想使用一个真正应该与你的服务器证书不同的客户端证书.(我不记得是否有效.)
  • 可能更容易,mysqli_ssl_set完全省略并在您的全局MySQL客户端配置文件中配置它(PHP应该可以在其中拾取它/etc/mysql/my.cnf,但这可能会因您的发行版而异):

    [client]
    ssl-ca=/mysql-ssl-certs/ca-cert.pem
    
    Run Code Online (Sandbox Code Playgroud)

(这类似于服务器配置,但在客户端/客户端部分.)

对于授权部分(GRANT):

  • REQUIRE SSL 只需要使用SSL/TLS
  • REQUIRE ISSUER,REQUIRE SUBJECTREQUIRE X509要求客户出示客户端证书来比较所需的值(这就是你需要使用的情况下ssl-key,并ssl-cert在客户端(配置或内mysqli_ssl_set).

  • 请注意,my.cnf 解决方案仅适用于 PHP &lt;5.3.0。较新的 PHP 版本默认使用 mysql 本机驱动程序 (mysqlnd) 与服务器通信,并且它不读取 my.cnf 或 my.ini http://php.net/manual/en/ref.pdo-mysql.php#pdo .constants.mysql-attr-读取默认文件 (2认同)