Docker WordPress:php8.3-apache配置MySQL加密连接遇权限拒绝问题排查
WordPress Docker镜像MySQL SSL连接问题排查
可能的错误原因
- 数据库用户权限限制:1045错误核心是身份认证失败,即便证书配置正确,如果
root@x.190用户没有被允许通过SSL连接(或无该IP的访问权限),数据库会直接拒绝请求。比如MySQL服务器开启了require_secure_transport=ON,但该用户未配置SSL访问权限;或者用户仅允许非SSL连接,而服务器强制要求SSL。 - 证书文件权限/路径问题:虽已将证书放到指定目录,但Apache/PHP的运行用户(通常为
www-data)可能没有证书读取权限。若证书权限为root:root且仅所有者可读(600),www-data无法加载证书,导致连接失败。 - WordPress参数未生效:部分WordPress版本或自定义配置中,
DB_SSL、MYSQL_CLIENT_FLAGS等参数可能未被正确识别,导致SSL配置未触发,连接仍以非SSL方式发起,不符合服务器要求。
如何验证证书是否被使用
1. 查看MySQL服务器日志
登录MySQL服务器,检查错误日志(默认路径如/var/log/mysql/error.log),搜索对应客户端IP的连接记录:
- 若日志出现
SSL connection established及证书相关信息,说明证书已被使用; - 若显示
connection without SSL,则证书未生效。
2. 容器内直接测试SSL连接
进入WordPress容器:
docker exec -it <容器ID/名称> bash
使用mysql客户端手动发起SSL连接:
mysql -h <数据库地址> -u root -p \ --ssl-mode=REQUIRED \ --ssl-key=/usr/src/wordpress/sql/client-key.pem \ --ssl-cert=/usr/src/wordpress/sql/client-cert.pem \ --ssl-ca=/usr/src/wordpress/sql/server-ca.pem
- 成功连接:证书本身有效且可被读取,问题出在WordPress配置或用户权限;
- 报
access denied:用户权限问题; - 报
unable to load certificate:证书权限/路径错误。
3. 添加临时调试代码
在wp-config.php末尾加入以下代码,访问站点首页查看连接状态:
$link = mysqli_init(); mysqli_ssl_set($link, MYSQL_SSL_KEY, MYSQL_SSL_CERT, MYSQL_SSL_CA, NULL, NULL); $connected = mysqli_real_connect($link, DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, NULL, NULL, MYSQL_CLIENT_FLAGS); if ($connected) { echo "SSL Cipher in use: " . mysqli_get_ssl_cipher($link); mysqli_close($link); } else { echo "Connection Error: " . mysqli_connect_error(); }
- 显示SSL Cipher信息:证书已正常使用;
- 显示连接错误:证书配置未生效。
证书未使用的排查步骤
1. 修正证书权限
在容器内执行命令,确保www-data可读证书:
# 修改证书所有者为www-data chown www-data:www-data /usr/src/wordpress/sql/*.pem # 设置可读权限 chmod 644 /usr/src/wordpress/sql/*.pem
2. 检查MySQL用户SSL权限
登录MySQL服务器,执行SQL查看用户配置:
SELECT user, host, ssl_type FROM mysql.user WHERE user='root';
- 若
ssl_type为空,说明用户未配置SSL访问权限,执行以下命令更新:
ALTER USER 'root'@'x.190' REQUIRE SSL; FLUSH PRIVILEGES;
- 若服务器强制要求SSL(
require_secure_transport=ON),需确保用户已配置SSL权限;若仅测试,可临时关闭该参数排查。
3. 确认WordPress参数有效性
检查wp-includes/class-wpdb.php中mysqli_real_connect的调用逻辑,确认是否正确读取了MYSQL_CLIENT_FLAGS和SSL参数。同时临时切换到默认主题、禁用所有插件,排除第三方代码覆盖配置的可能。
4. 验证PHP mysqli SSL支持
在容器内执行命令,查看mysqli扩展的SSL支持状态:
php -i | grep -i ssl
确保mysqli.ssl_capable显示为On,若为Off,说明PHP扩展未编译SSL支持,需更换包含SSL的镜像或重新编译扩展。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

