【问题标题】:Error when connecting from a web server to a remote MySQL DB Server从 Web 服务器连接到远程 MySQL 数据库服务器时出错
【发布时间】:2020-06-02 21:54:15
【问题描述】:

我一直在努力从 Ubuntu 16.04 版网络服务器进行连接 (在 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 代码 sn-p 打开与数据库服务器的连接时,出现错误(见下文):

// 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 代码连接到远程数据库服务器?

【问题讨论】:

标签: php mysql amazon-ec2 ubuntu-16.04


【解决方案1】:

您需要在数据库设置中进行额外配置:

$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();
}

希望这能有所帮助。

【讨论】:

  • Mirdrack - 我在网络服务器上为代码制作了你建议的模组,但我得到:连接失败连接错误(2002):
  • 对于 ssl_set 函数调用中显示的客户端密钥文件,我需要在 Web 服务器(客户端)上进行一些设置吗?
  • 2002 错误通常表示系统上没有运行 MySQL 服务器或者您使用的端口不正确 您可以通过 localhost 连接吗?
  • howtoforge.com/tutorial/… 的帖子中,似乎我需要使用 ssl 证书配置数据库服务器和 Web 服务器客户端。我在数据库服务器上的 /etc/mysql/mysql.conf.d/mysqld.cnf 中的配置文件显示: [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/ mysqld.sock datadir = /var/lib/mysql log-error = /var/log/mysql/error.log bind-address = 0.0.0.0 #require_secure_transport = on
  • 问题已修复。我使用了以下内容:删除了 mysqli_options 行。湾。在调用 mysqli_real_connect 时将 MYSQLI_CLIENT_SSL 选项替换为 MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT 发现其他遇到类似问题的开发人员也报告了这一点。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多