我已经在一个网络上的一台服务器上成功设置了启用SSL的MySQL安装,并且可以使用SSL和Linux命令行mysql客户端在不同网络上的另一台服务器上使用SSL连接到它,但是每次我尝试连接时(使用PHP 5.3) .3)我不断得到:
警告:mysqli_real_connect():(HY000 / 2026):第18行上的/var/www/html/test.php中的SSL连接错误
我的PHP如下所示,我做错了什么?证书是777(仅在测试时),并且相同的代码适用于其他用户的未加密连接(SSL设置被注释掉,即mysqli可以肯定地通常连接到数据库)
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(); ?>
在这里,PHP(和mysqli_real_connect)是客户端而不是服务器。您正在使用mysqli_ssl_set客户端证书身份验证(以及服务器密钥和证书)对其进行配置。
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
无论如何,它们都不属于客户端(只有CA证书才属于,但绝对不是服务器的私钥)。
完成此操作后,您可以尝试使用命令行客户端查看服务器是否配置正确:
mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
或这样做(尽管应该确实启用验证服务器证书以使SSL / TLS有用)
mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...
这至少应该在命令行上起作用。
然后,从PHP获得两种选择:
$key
$cert
/etc/mysql/my.cnf
[client]
ssl-ca=/mysql-ssl-certs/ca-cert.pem
(这类似于服务器配置,但在客户端/客户端部分。)
对于授权部分(GRANT):
GRANT
REQUIRE SSL
REQUIRE ISSUER
REQUIRE SUBJECT
REQUIRE X509
ssl-key
ssl-cert