Windows下Qt应用连接远程MySQL报SSL协议版本不匹配错误求助
排查Qt Windows应用连接OpenSSL3.0.x MySQL服务器的SSL协议不匹配问题
确认Windows端Qt程序依赖的OpenSSL版本
你的Windows版Qt应用大概率依赖OpenSSL 1.1.x(预编译Qt包通常自带该版本),而服务器升级到OpenSSL3.0后,默认可能禁用了TLS1.0/TLS1.1这类旧协议,导致两端协议协商失败。可以通过以下方式确认:- 查看程序目录下的SSL相关动态库(如
libssl-1_1.dll、libcrypto-1_1.dll),判断版本; - 用依赖分析工具(如Dependency Walker)检查Qt程序或QMYSQL驱动的依赖库版本。
- 查看程序目录下的SSL相关动态库(如
调整MySQL服务器的SSL协议与加密套件配置
OpenSSL3.0对协议和加密套件的默认支持有变化,需修改MySQL配置文件(my.cnf/my.ini),添加或调整以下参数:# 允许兼容的TLS版本,至少包含TLS1.2(同时支持TLS1.3更好) tls_version = TLSv1.2,TLSv1.3 # 配置新旧OpenSSL都支持的加密套件 ssl_cipher = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384修改后重启MySQL服务,测试Windows端连接。
升级Windows端Qt应用的OpenSSL库
直接给Windows端程序替换为OpenSSL3.0.x版本的动态库(libssl3.dll、libcrypto3.dll),将这两个文件放在Qt应用的可执行文件同目录下,再测试连接。注意要下载对应架构(32/64位)的版本,与你的Qt程序编译架构一致。强制Qt数据库连接使用指定TLS版本
在Qt代码中显式指定SSL连接使用的TLS版本,避免协商时选用旧协议。修改连接配置:QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("your-host"); db.setUserName("your-user"); db.setPassword("your-pass"); db.setDatabaseName("your-db"); // 强制使用TLS1.2或TLS1.3 db.setConnectOptions("MYSQL_OPT_SSL_CA=./ca.pem;" "MYSQL_OPT_SSL_CERT=./client-cert.pem;" "MYSQL_OPT_SSL_KEY=./client-key.pem;" "MYSQL_OPT_SSL_TLS_VERSION=TLSv1.2");验证SSL握手过程
使用不同版本的OpenSSL客户端测试连接,定位问题:- 在Windows端用OpenSSL1.1.x执行:
openssl s_client -connect your-mysql-host:3306 -tls1_2 - 用OpenSSL3.0.x执行同样命令,对比两者的输出,查看是否有握手失败、加密套件不匹配等信息。
- 在Windows端用OpenSSL1.1.x执行:
检查MySQL用户的SSL权限配置
确认你的MySQL用户没有限制过严的SSL要求,执行以下SQL语句查看权限:SHOW GRANTS FOR 'your-user'@'%';确保权限中的SSL要求(如
REQUIRE SSL/REQUIRE X509)与当前的SSL配置兼容。
内容的提问来源于stack exchange,提问作者bullet
相关产品推荐
相关产品推荐

