PHP连接MariaDB提示Access denied问题求助
解决PHP连接MariaDB时的SSL权限拒绝问题
从你提供的MariaDB日志可以明确问题根源:
- 命令行
mariadb工具连接时使用了SSL/TLS,符合数据库的权限配置,所以成功 - PHP的mysqli连接使用的是普通
TCP/IP未加密连接,不符合用户权限要求,因此被拒绝
以下是具体解决步骤:
1. 在PHP mysqli连接中强制启用SSL
你需要显式告诉mysqli使用SSL连接,有两种实现方式:
方式一:通过连接选项启用SSL
修改你的PHP代码,在实例化mysqli时传入SSL启用选项:
$host = "mysql.mydomain.com"; $username = "test"; $password = "123"; $database = "test"; $port = 3306; // 启用SSL的连接选项 $ssl_options = [ MYSQLI_CLIENT_SSL => true, // 若你的MariaDB要求验证CA证书,需添加证书路径(根据实际路径调整) // MYSQLI_CLIENT_SSL_CA => '/etc/letsencrypt/live/mysql.mydomain.com/chain.pem' ]; $mysqli = @new mysqli($host, $username, $password, $database, $port, null, $ssl_options); if ($mysqli->connect_error) { die("Connection failed: " . $mysqli->connect_error); }
方式二:使用mysqli_ssl_set函数配置SSL
$host = "mysql.mydomain.com"; $username = "test"; $password = "123"; $database = "test"; $port = 3306; $mysqli = mysqli_init(); // 配置SSL,前三个参数为客户端证书/密钥路径,若无需客户端验证可传null mysqli_ssl_set($mysqli, null, null, '/etc/letsencrypt/live/mysql.mydomain.com/chain.pem', null, null); $connection_success = $mysqli->real_connect($host, $username, $password, $database, $port); if (!$connection_success) { die("Connection failed: " . $mysqli->connect_error); }
2. 确认MariaDB用户权限配置
登录MariaDB服务器,执行以下命令检查test用户的权限规则:
SHOW GRANTS FOR 'test'@'%';
如果结果中包含REQUIRE SSL,说明该用户必须通过SSL连接才能访问数据库,这正是PHP非SSL连接被拒绝的核心原因。
3. 可选:全局启用PHP mysqli的SSL连接
如果你的所有PHP应用都需要连接该MariaDB,可以修改php.ini配置文件,设置全局默认启用SSL:
mysqli.default_ssl = 1
修改后重启PHP-FPM生效。
内容的提问来源于stack exchange,提问作者user16712485
相关产品推荐
相关产品推荐

