无法使用 SSL 和 SHA256 密码验证连接到远程 mysql 数据库

无法使用 SSL 和 SHA256 密码验证连接到远程 mysql 数据库

我可以从 Web 服务器的 CLI 通过安全连接成功连接,但通过 php 脚本测试连接时收到错误消息。

从 Web 服务器命令行查看 mysql 状态

mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

Connection id:      9
Current database:   
Current user:       [email protected]
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.21-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     0.0.0.0 via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
TCP port:       3306
Uptime:         3 days 4 hours 53 min 35 sec

Threads: 1  Questions: 17  Slow queries: 0  Opens: 107  Flush tables: 1  Open tables: 26  Queries per second avg: 0.000

来自 Web 服务器 CLI 的 SSL 变量

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+

从 Web 服务器 cli 授予权限

+-------------------------------------------------------------+
| Grants for [email protected]                             |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'0.0.0.0'              |
| GRANT SELECT ON `testDB`.* TO 'test'@'0.0.0.0' |
+-------------------------------------------------------------+

从 Web 服务器 cli 使用 utf8mb4 字符集

+--------------------------+------------------------+
| Variable_name            | Value                  |
+--------------------------+------------------------+
| character_set_client     | utf8mb4                |
| character_set_connection | utf8mb4                |
| character_set_database   | utf8mb4                |
| character_set_filesystem | binary                 |
| character_set_results    | utf8mb4                |
| character_set_server     | utf8mb4                |
| character_set_system     | utf8                   |
| collation_connection     | utf8mb4_unicode_520_ci |
| collation_database       | utf8mb4_unicode_520_ci |
| collation_server         | utf8mb4_unicode_520_ci |
+--------------------------+------------------------+

远程数据库上的用户权限

+------------------+-------------+-----------------------+----------+
| user             | host        | plugin                | ssl_type |
+------------------+-------------+-----------------------+----------+
| test             | 0.0.0.0     | sha256_password       | X509     |
+------------------+-------------+-----------------------+----------+

Web 服务器上的证书权限

apache@web:~$ ls -al /etc/mysql-client
total 20
drwxr-xr-x  2 root root 4096 Mar 24 02:30 .
drwxr-xr-x 99 root root 4096 Mar 30 20:04 ..
-r-xr-xr-x  1 root root 1107 Mar 24 02:30 ca.pem
-r-xr-xr-x  1 root root 1107 Mar 24 02:30 client-cert.pem
-r-xr-xr-x  1 root root 1679 Mar 24 02:30 client-key.pem

Web 服务器上的 PHP 测试脚本

$dsn = 'mysql:host=db.test.com;port=3306;dbname=testDB;charset=utf8mb4';
$dbuser = 'test';
$dbpass = 'sha256-hash';

$dboptions = array (
    PDO::MYSQL_ATTR_SSL_KEY    =>'/etc/mysql-client/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT   =>'/etc/mysql-client/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA     =>'/etc/mysql-client/ca.pem',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false 
);

    try {
        $conn = new PDO($dsn,$dbuser,$dbpass,$dboptions);
        if($conn){
                echo "Connection established";
        }
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }

从 Web 服务器到数据库服务器的网络连接成功

Connection to 0.0.0.0 3306 port [tcp/mysql] succeeded!

来自 Web 服务器的错误消息

apache@web:~$ php -f test.php
Connection failed: SQLSTATE[HY000] [2002]

我有几个问题:

  • php 脚本中使用的数据库密码应该设置为纯文本密码字符串还是 sha256 哈希?我都试过了,但都不起作用。

  • 由于证书位于具有全局权限的 /etc 中,并且 php 脚本具有明确的文件路径,是否有必要在 Web 服务器上创建数据库用户帐户?例如,Web 服务器上的“测试”用户实际上仅用于从命令行测试 mysql 连接。我不明白 apache 如何依赖测试用户。

  • 我应该查看哪些 php.ini 设置?我测试过的唯一一个设置是将“open_basedir”更改为包含 /etc/mysql-client 目录,但这也没有任何作用。

  • 有人知道吗错误 #77595已经修复?

  • 有谁真正使用 PHP 通过 SSL 实现了 sha256_password 身份验证?

更新 #1

据称错误 #77595这个问题在 php7.2.3 中已经修复,所以我启动了一个新的虚拟机,ubuntu18.04 的默认软件包是 php7.2.3,但仍然没有成功。var_dump 中唯一有用的错误字符串是

"PDO::__construct(): SSL operation failed with code 1. OpenSSL Error 
messages: error:0906D06C:PEM routines:PEM_read_bio:no start line"

mysql 从命令行登录仍然可以使用相同的证书,只是 php 不喜欢它们。我从 mysql 服务器 scp 了它们,因此出现格式错误的可能性不大。

答案1

我对这个问题没有明确的答案。我猜想 yaSSL 出了问题。我最终改用了 Percona,它实现了 openSSL。

相关内容