与 PHP 和 Percona 8 具有相同主题的自签名 OpenSSL 证书

问题描述

我看到了一种我无法解释自己的行为,所以我希望有人能帮助我理解正在发生的事情。

设置

我在 Debian 上使用 PHP 7.4 远程连接到安装了 OpenSSL 1.1.1d 的 Percona 8 (8.0.20-11) 服务器(也是 Debian)。

这是我到目前为止所做的:

  1. 按照此处所述创建自签名 SSL 证书:https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-files-using-openssl.html
# Create CA certificate
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem -subj "/CN=percona-certificate"

# Create server certificate,remove passphrase,and sign it
# server-cert.pem = public key,server-key.pem = private key
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=percona-certificate"
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

注意: CA 和服务器证书上的主题是相同的。

  1. 在 Percona 中使用 SSL 证书。除了警告之外,这没有错误

    Server SSL certificate doesn't verify: self signed certificate
    CA certificate ... is self signed.
    
  2. 将 SSL 证书复制到另一台服务器并使用以下 PHP 脚本进行连接:

    $db_config = [
        'host'       => '123.123.123.123','port'       => '3306','dbname'     => 'dbname','username'   => 'username','password'   => 'password','ssl_ca'     => '/cert-path/ca.pem','ssl_cert'   => '/cert-path/server-cert.pem','ssl_key'    => '/cert-path/server-key.pem','ssl_verify' => false
    ];
    $pdo = new PDO(
        'MysqL:host=' . $db_config['host'] . ';port=' . $db_config['port'] . ';dbname=' . $db_config['dbname'],$db_config['username'],$db_config['password'],[
            PDO::MysqL_ATTR_INIT_COMMAND           => 'SET NAMES utf8',PDO::ATTR_TIMEOUT                      => 1,PDO::ATTR_ERRMODE                      => PDO::ERRMODE_EXCEPTION,PDO::MysqL_ATTR_SSL_CA                 => $db_config['ssl_ca'],PDO::MysqL_ATTR_SSL_CERT               => $db_config['ssl_cert'],PDO::MysqL_ATTR_SSL_KEY                => $db_config['ssl_key'],PDO::MysqL_ATTR_SSL_VERIFY_SERVER_CERT => $db_config['ssl_verify']
        ]
    );
    $query = $pdo->query('SELECT COUNT(*) FROM mytable');
    

行为

虽然 Percona 启动似乎没有问题,但我无法通过 PHP 连接到 Percona 服务器:
sqlSTATE[HY000] [2006] MysqL server has gone away

最多让我感到困惑的是,当我更改证书的主题以使它们不相同时,它就像一种魅力。查询按预期返回表中的行数。

我的问题

谁能向我解释一下这里发生了什么?
为什么 Percona 正在启动但不接受来自远程且具有相同主题的证书的连接?
为什么它适用于不同的主题
如果 OpenSSL 进行了验证,为什么它不忽略相同的主题,因为 CA 证书无论如何都是自签名的?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)