开启--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);
外部数据库连接被拒的排查与修复
- 检查防火墙/安全组:确认外部数据库服务器的防火墙或云服务商安全组,是否允许你的本地IP访问3306端口。
- 用户权限配置:确保外部数据库的用户账号允许从你的IP连接,例如执行授权语句:
GRANT ALL ON 你的数据库名.* TO '你的用户名'@'你的本地IP' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES; - SSL连接要求:外部数据库如果同样开启了
require_secure_transport,必须按照上述本地连接的方式启用SSL连接。 - 端口与地址验证:确认外部数据库的主机地址、端口号是否正确,避免拼写错误。
内容的提问来源于stack exchange,提问作者Soufghalb
相关产品推荐
相关产品推荐

