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)
这里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/TLSREQUIRE ISSUER,REQUIRE SUBJECT并REQUIRE X509要求客户出示客户端证书来比较所需的值(这就是你需要使用的情况下ssl-key,并ssl-cert在客户端(配置或内mysqli_ssl_set).| 归档时间: |
|
| 查看次数: |
23513 次 |
| 最近记录: |