You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开启--require_secure_transport后MySQLi连接报错(HY000/3159)的安全修复方案

解决MySQL安全传输强制要求的连接错误

错误原因

你的MySQL服务器启用了--require_secure_transport=ON配置,强制所有数据库连接必须使用SSL/TLS加密传输,而当前PHP代码中的mysqli连接未启用SSL,因此触发HY000/3159错误。

本地数据库的安全修复方案

1. 为本地MySQL配置SSL证书(自签证书用于测试,生产环境使用可信CA证书)

  • 用OpenSSL生成自签证书:
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server-key.pem -out server-cert.pem
    
  • 修改MySQL配置文件(my.cnf或my.ini),添加SSL配置:
    [mysqld]
    ssl-ca=server-cert.pem
    ssl-cert=server-cert.pem
    ssl-key=server-key.pem
    
  • 重启MySQL服务使配置生效。

2. 修改PHP连接代码启用SSL

有两种方式实现,任选其一即可:

方式一:直接在mysqli_connect中传入SSL标志

$dbh = mysqli_connect(
    hostname: $host,
    username: $username,
    password: $password,
    database: $dbname,
    flags: MYSQLI_CLIENT_SSL
);

if (mysqli_connect_errno()) {
    die("Connection error: " . mysqli_connect_error()); // 改用mysqli_connect_error()获取具体错误信息,比errno更直观
}

方式二:使用mysqli_init和SSL选项设置(更灵活)

$dbh = mysqli_init();
// 本地自签证书可关闭服务器证书验证,生产环境建议开启(设置为true)
mysqli_options($dbh, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);
// 指定CA证书路径(替换为你的证书实际存储路径)
mysqli_ssl_set($dbh, null, null, 'server-cert.pem', null, null);

if (!mysqli_real_connect($dbh, $host, $username, $password, $dbname)) {
    die("Connection error: " . mysqli_connect_error());
}

代码额外修正

你的代码中存在变量名不一致问题:$stmt = mysqli_stmt_init($conn);里的$conn应该是$dbh,否则会触发未定义变量错误,修正后:

$stmt = mysqli_stmt_init($dbh);

外部数据库连接被拒的排查与修复

  1. 检查防火墙/安全组:确认外部数据库服务器的防火墙或云服务商安全组,是否允许你的本地IP访问3306端口。
  2. 用户权限配置:确保外部数据库的用户账号允许从你的IP连接,例如执行授权语句:
    GRANT ALL ON 你的数据库名.* TO '你的用户名'@'你的本地IP' IDENTIFIED BY '你的密码';
    FLUSH PRIVILEGES;
    
  3. SSL连接要求:外部数据库如果同样开启了require_secure_transport,必须按照上述本地连接的方式启用SSL连接。
  4. 端口与地址验证:确认外部数据库的主机地址、端口号是否正确,避免拼写错误。

内容的提问来源于stack exchange,提问作者Soufghalb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:20:27