我正在尝试使用 SSL 连接到 Azure MySQL 5.7,但遇到了似乎无法解决的错误。
连接工作正常
- mysql.exe
- MySQL 工作台 8.0
连接不起作用
- Qt
- MySQL 连接器/C 8.0.18
我使用以下工作命令调用 mysql.exe
mysql.exe -h server.mysql.database.azure.com -u user@server -p --ssl
此连接不会出现任何问题。 MySQL Workbench 8.0 也运行良好。
但是使用 Qt MySQL 插件连接会产生此错误。
SSL 连接错误:套接字层接收错误
这是我用来连接的 Qt 代码
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");
db.setConnectOptions("SSL_CA=C:/Users/User/Downloads/BaltimoreCyberTrustRoot.crt.pem");
if (!db.open()) {
std::cout << db.lastError().text().toStdString() << "\n";
}
接下来我尝试使用 MySQL Connector/C(Qt 在下面使用)直接连接到 Azure 数据库。
MYSQL* mysql = mysql_init(nullptr);
char* t = "C:/Users/User/Downloads/BaltimoreCyberTrustRoot.crt.pem";
mysql_ssl_set(mysql, nullptr, nullptr, t, nullptr, nullptr);
if (!mysql_real_connect(mysql, "server.mysql.database.azure.com", "user@server", "password", "databasename", 3306, nullptr, 0)) {
fprintf(stderr, "Failed to connect to database: Error: %s\n", mysql_error(mysql));
}
mysql_close(mysql);
两者都会产生套接字层错误。
在 Azure 中禁用 SSL 允许我连接 Qt 和 MySQL Connector/C。这意味着连接数据(用户名、密码、主机名)是正确的,但设置 SSL 选项可能存在问题。
Qt版本5.13.1
MySQL 连接器/C 8.0.18
MySQL 数据库 5.7
最佳答案
我没有接触过 Qt,但我接触过 MySQL 和 SSL,所以读完你的问题后我很感兴趣。
我不敢告诉您,Qt 似乎无意中通过此更新编码了传输安全功能:
https://codereview.qt-project.org/c/qt/qtbase/+/96849/11/src/sql/drivers/mysql/qsql_mysql.cpp
我无意中这么说,因为我不敢相信他们打算用客户端证书身份验证替换 CLIENT_SSL。 CLIENT_SSL 仍然是 mysql_real_connect 接口(interface)的有效选项,但选项验证忽略它。如果没有联系,我只能假设开发人员的任务是更新代码以支持客户端证书和混淆客户端证书与传输加密,交换功能而不是添加功能。
此重大更改是在版本 5.5 中引入的。如果您足够大胆,您可以提取代码库并进行更改:
else if (opt == QLatin1String("CLIENT_SSL"))
qWarning("QMYSQLDriver: SSL_KEY, SSL_CERT and SSL_CA should be used instead of CLIENT_SSL.");
致:
else if (opt == QLatin1String("CLIENT_SSL"))
optionFlags |= CLIENT_SSL;
编译并祝你好运...或者你有这些选择。
- 降级到 Qt 5.2(是的,我知道,但是......)
- 如果您有 CA 私钥,generate a client certificate signed by the CA并添加 SSL_CERT 和 SSL_KEY 连接选项,并希望这已经足够了(我没有更深入地研究代码)
关于mysql - Qt MySQL 通过 SSL 连接到 Azure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58464861/