mysql - Qt MySQL 通过 SSL 连接到 Azure

标签 mysql azure qt ssl mysql-connector

我正在尝试使用 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;

编译并祝你好运...或者你有这些选择。

  1. 降级到 Qt 5.2(是的,我知道,但是......)
  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/

相关文章:

mysql - 我应该如何在存储过程中临时存储行?

azure - AADB2C90068 : The provided application with ID is not valid against this service. 请使用通过 B2C 门户创建的应用程序,然后重试

c++ - 为什么 WindowStateChange 事件对我不起作用

c++ - Qt or general c++ 如何在c++中获取或检测<a href ="file.html">的主机

mysql - 允许在 mysql 整数列中引用值吗?

mysql - 分组用户,MySQL 上匹配的连续值

azure - 如何使用相同的 URL 在 Azure 中运行网站?

c++ - 当鼠标在应用程序窗口之外时使用 grabMouse() 后 QQuickItem 未接收到鼠标事件

php - 从数组中加载特定数据

sql-server - 自 3 天前起在 Azure Blob 存储中创建 Sql 备份时出现信号量超时错误