Qt MySQL соединяется с Azure через SSL - PullRequest
4 голосов
/ 19 октября 2019

Я пытаюсь подключиться к Azure MySQL 5.7 с помощью SSL, но у меня возникла ошибка, которую я не могу устранить.

Подключение работает нормально для

  • mysql.exe
  • MySQL Workbench 8.0

Соединение не работает для

  • Qt
  • MySQL Connector / 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 connection error: socket layer receive error

Это код 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);

, которые оба вызывают ошибку уровня сокета,

Отключение SSL в Azure позволяет мне соединяться как с Qt, так и с MySQL Connector / C. Это означает, что данные соединения (имя пользователя, пароль, имя хоста) верны, но, возможно, существует проблема с настройкой параметров SSL.

Qt версия 5.13.1
MySQL Connector / C 8.0.18
MySQL DB 5.7

1 Ответ

0 голосов
/ 24 октября 2019

Я не имею никакого отношения к 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, но проверка параметров игнорирует его. Не обращая внимания, я могу только предположить, что разработчику было поручено обновить код для поддержки клиентских сертификатов и перепутать клиентские сертификаты с транспортным шифрованием, меняя функциональность вместо добавления к ней.

Это критическое изменение было введено в версии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, генерирует сертификат клиента, подписанный CA идобавьте параметры подключения SSL_CERT и SSL_KEY и надеюсь, что этого достаточно (я не углублялся в код)
...