我可以从 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。