使用PHP mysqli通过SSL连接MySQL

pprl5pva  于 2023-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(149)

我试图设置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".....

任何想法将不胜感激。这真的要了我的命

olmpazwi

olmpazwi1#

这个问题可能是由于PHP 5.6中所做的更改而导致的。我猜你正在使用自签名证书?如果您的DB通过DEFAULT启用了peer_name验证,则无法在PHP中禁用此功能。因此,在生成证书时,您必须为每个证书使用正确的“通用名称”:
CA:hostname服务器:FQND,例如hostname.example.com客户端:somename
重要的部分是服务器证书,其中公用名称必须与您连接的主机相同。

o2gm4chl

o2gm4chl2#

它看起来是这样的
SSL3_GET_SERVER_CERTIFICATE:证书验证失败
我的猜测是您没有设置正确的CA。一些数据库系统(如Amazon Web Services RDS)有自己的CA文件。您正在使用capath参数,因此请确保PEM文件位于该路径中。如果是,我接下来要做的就是切换到the third argument of ssl_set并直接指定PEM文件

$mysqli->ssl_set(NULL, NULL, '/path/to/ca.pem', NULL, NULL);
u3r8eeie

u3r8eeie3#

一点简单的方法方便actucaly mysqli

<?php  namespace mysqlConnect;

class mymysqli extends \mysqli {

        
        public function __construct($db_host, $db_user, $db_pass, $db_name, $persistent = true, $ssl = false, $certpublic = "") {
            //$this->close();
            parent::init();
            //parent::options(MYSQLI_OPT_CONNECT_TIMEOUT, 1);
            if($ssl) {
                parent::options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);
                parent::ssl_set(NULL, NULL, $certpublic, NULL, NULL);
            }
            @parent::real_connect(($this->persistent ? 'p:' : '') . $this->db_host, $this->db_user, $this->db_pass, $this->db_name);

        }
}

相关问题