我试图设置PHP mysqli连接到MariaDB数据库的两个VPS服务器,并需要加密通信,由于它是在公共网络。
目前,我可以通过命令行mysql客户端正常地从客户端服务器连接到数据库服务器,并且我已经通过tcpdump检查了连接是否加密。但是,由于某些原因,我无法理解PHP部分。这是相对基本的nginx + php5-fpm + mariadb设置,但mysql是在非默认端口工作。Debian杰西,Php5 5.6.7,Mariadb 10.0.16,nginx 1.6.2
下面是测试脚本:
<?php
$DB_NAME = '';
$DB_HOST = '111.111.111.111';
$DB_USER = 'username';
$DB_PASS = 'password';
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
//have tried witha and without the following with multiple variations
$mysqli->ssl_set(NULL, NULL, NULL,'/etc/mysql/ssl/',NULL);
if (!$mysqli->real_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME, 11111, NULL,MYSQLI_CLIENT_SSL )) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
$query = "SHOW STATUS LIKE 'ssl_cipher'";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
if($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
print_r($row);
}
}
else {
echo 'NO RESULTS';
}
mysqli_close($mysqli);
?>
没有ssl_set时出现的主要错误:
2015/07/11 15:58:34 [error] 2857#0: *374 FastCGI sent in stderr: "PHP message: PHP Warning: mysqli::real_connect(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /srv/www/test.php on line 15
PHP message: PHP Warning: mysqli::real_connect(): Cannot connect to MySQL by using SSL in /srv/www/test.php on line 15
PHP message: PHP Warning: mysqli::real_connect(): [2002] (trying to connect via tcp://192.168.130.123:42139) in /srv/www/test.php on line 15
PHP message: PHP Warning: mysqli::real_connect(): (HY000/2002): in /srv/www/test.php on line 15".....
任何想法将不胜感激。这真的要了我的命
3条答案
按热度按时间olmpazwi1#
这个问题可能是由于PHP 5.6中所做的更改而导致的。我猜你正在使用自签名证书?如果您的DB通过DEFAULT启用了peer_name验证,则无法在PHP中禁用此功能。因此,在生成证书时,您必须为每个证书使用正确的“通用名称”:
CA:hostname服务器:FQND,例如hostname.example.com客户端:somename
重要的部分是服务器证书,其中公用名称必须与您连接的主机相同。
o2gm4chl2#
它看起来是这样的
SSL3_GET_SERVER_CERTIFICATE:证书验证失败
我的猜测是您没有设置正确的CA。一些数据库系统(如Amazon Web Services RDS)有自己的CA文件。您正在使用
capath
参数,因此请确保PEM文件位于该路径中。如果是,我接下来要做的就是切换到the third argument of ssl_set并直接指定PEM文件u3r8eeie3#
一点简单的方法方便actucaly mysqli