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

Qt及MySQL Connector/C通过SSL连接Azure MySQL 5.7报错排查

解决Azure MySQL 5.7 SSL连接:Qt/Connector/C报错但官方工具正常的问题

你的问题很典型——Azure MySQL的SSL连接在mysql.exe和Workbench里能正常工作,但Qt 5.13.1的QMYSQL插件及MySQL Connector/C 8.0.18却报SSL connection error: socket layer receive error,禁用Azure SSL后一切正常,说明核心问题出在TLS版本兼容性或SSL配置细节的差异上,下面是针对性的解决方案:

1. 强制指定TLS 1.2版本

Azure MySQL 5.7要求使用TLS 1.2及以上版本,但Qt的QMYSQL插件和Connector/C 8.0.18可能默认使用的TLS版本不匹配(比如Connector/C可能尝试用TLS 1.3,但Azure MySQL 5.7不支持)。

针对Qt代码修改

在设置连接选项时,显式指定TLS版本和SSL强制模式:

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("server.mysql.database.azure.com");
db.setPort(3306);
db.setDatabaseName("databasename");
db.setUserName("user@server");
db.setPassword("password");
// 新增TLS版本指定,同时确保SSL强制启用
db.setConnectOptions("SSL_CA=C:/Users/User/Downloads/BaltimoreCyberTrustRoot.crt.pem;MYSQL_OPT_SSL_MODE=REQUIRED;MYSQL_OPT_SSL_CIPHER=TLSv1.2");
if (!db.open()) {
    std::cout << db.lastError().text().toStdString() << "\n";
}

针对Connector/C代码修改

在mysql_real_connect前,添加TLS版本和SSL模式的配置:

MYSQL* mysql = mysql_init(nullptr);
char* t = "C:/Users/User/Downloads/BaltimoreCyberTrustRoot.crt.pem";
// 强制启用SSL并指定TLS 1.2
mysql_options(mysql, MYSQL_OPT_SSL_MODE, SSL_MODE_REQUIRED);
mysql_options(mysql, MYSQL_OPT_SSL_CIPHER, "TLSv1.2");
mysql_ssl_set(mysql, nullptr, nullptr, t, nullptr, nullptr);
// 连接时添加CLIENT_SSL标志
if (!mysql_real_connect(mysql, "server.mysql.database.azure.com", "user@server", "password", "databasename", 3306, nullptr, CLIENT_SSL)) {
    fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(mysql));
}
mysql_close(mysql);

2. 检查证书路径与格式

官方工具对路径的容错性更高,但Qt和Connector/C对路径解析更严格:

  • 确保证书是PEM格式(你用的.crt.pem是对的,但可以打开文件确认开头是-----BEGIN CERTIFICATE-----)
  • 路径尽量用正斜杠/,或者用双反斜杠\\转义(避免单斜杠被解析为转义字符):
    比如Qt里改成:"SSL_CA=C:\\Users\\User\\Downloads\\BaltimoreCyberTrustRoot.crt.pem"
  • 确认程序有证书文件的读取权限(比如不要放在需要管理员权限的目录)

3. 修复Qt QMYSQL插件的SSL依赖问题

Qt的QMYSQL插件默认依赖系统的OpenSSL库,而不是MySQL自带的SSL库:

  • 如果你的系统OpenSSL版本低于1.0.1(不支持TLS 1.2),请安装与Qt版本匹配的OpenSSL(32/64位要对应)
  • 将OpenSSL的核心dll文件(比如libssl-1_1-x64.dll、libcrypto-1_1-x64.dll)复制到Qt程序的运行目录下
  • 或者重新编译Qt的QMYSQL插件,让它链接到MySQL 8.0.18自带的SSL库,确保版本兼容

4. 验证Azure MySQL的SSL配置

登录Azure门户,确认你的MySQL服务器的SSL enforcement设置为Enabled,同时Minimum TLS version设置为TLS 1.2(这是最稳妥的配置,避免版本协商问题)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:18:13