我一直在努力从Ubuntu 16.04版Web服务器进行连接(在1个AWS实例上运行,使用PHP 7.0.33和Apache 2.7.18)使用在另一个AWS实例(运行Ubuntu版本16.04)上运行的MySQL 8.0.19与数据库服务器进行通信。
我设置了数据库服务器并对其进行了如下配置:
我编辑文件/etc/mysql/mysql.conf.d/mysqld.cnf
我在[mysqld]部分添加以下内容[mysqld]
require_secure_transport = on
我保存文件并从控制台发出问题:
sudo mysql_ssl_rsa_setup --uid=mysql
然后我用以下命令重新启动mysql:
sudo systemctl restart mysql
我已经在此数据库服务器上创建了一个数据库和表。
我还在此数据库服务器上创建了一个远程用户,如下所示(IP地址和用户是虚构的:]
CREATE USER 'Master'@'1.26.4.44' IDENTIFIED BY 'admin';
GRANT ALL PRIVILEGES ON sample_data_base.* TO ' Master'@'1.26.4.44';
FLUSH PRIVILEGES;
Exit
我已成功从Web服务器客户端实例测试到此数据库服务器的连接性:
mysql -u Master -p -h '1.26.4.44'
但是,当我使用Web服务器客户端实例中的以下PHP代码段时打开与数据库服务器的连接,出现错误(如下所示):
// set up for remote DB access
$dbhost = '1.26.4.44'; // Unlikely to require changing
$dbname = 'sample_data_base'; // Modify these...
$dbuser = 'Master'; // ...variables according
$dbpass = "admin"; // ...to your installation
$appname = "test_app"; // ...and preference
$dbconnection = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
if ( !$dbconnection)
{
echo "connection failed ";
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
错误是:
Connect Error (3159) Connections using insecure transport are prohibited while --require_secure_transport=ON
就像供参考,当我注释掉数据库服务器中的行时,文件/etc/mysql/mysql.conf.d/mysqld.cnf
# require_secure_transport = on
与远程数据库服务器的php代码连接没有问题。
我在Web服务器客户端上缺少什么要让我从php代码连接到远程数据库服务器?
您需要在数据库设置中进行其他配置:
$db = mysqli_init();
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true);
$db->ssl_set(
'/etc/mysql/ssl/client-key.pem',
'/etc/mysql/ssl/client-cert.pem',
'/etc/mysql/ssl/ca-cert.pem',
NULL,
NULL);
$link = mysqli_real_connect(
$db, 'ip', 'user', 'password', 'db', 3306, NULL, MYSQLI_CLIENT_SSL);
if (!$link)
{
die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\n");
} else {
// your queries should be here
$db->close();
}