v
vlaaad2026 лютого 2020 р. 17:13

Не получается подключиться с SSL-сертификатом к API

qt, c++, openssl

Всем привет! Я пытаюсь написать бота биржи ставок Betfair, используя их API, с помощью Qt и C++. Мне нужно подключиться к их API в неинтерактивном режиме, поэтому я создал сертификат и закрытый ключ через OpenSSl (64-bit), которую я скачал отдельно от Qt. На Python у меня все работает хорошо, это означает, что сертификат и ключ созданы правильно.

import requests

payload = 'username=myusername&password=mypassword'
headers = {'X-Application': 'myappkey',
           'Content-Type': 'application/x-www-form-urlencoded'}

response = requests.post('https://identitysso-cert.betfair.com/api/certlogin', 
                         data=payload, 
                         cert=('C:/Program Files/OpenSSL-Win64/bin/client-2048.crt', 
                               'C:/Program Files/OpenSSL-Win64/bin/client-2048.key'), 
                         headers=headers)

Пытаюсь сделать аналогичное на C++ и Qt, но ничего не выходит.

#include <QCoreApplication>

#include <QNetworkAccessManager>
#include <QFile>
#include <QNetworkReply>
#include <QSslKey>
#include <QSslConfiguration>

#include <QDebug>

QSslCertificate sslCertificate()
{
    QFile certFile("C:/Program Files/OpenSSL-Win64/bin/client-2048.crt");

    if(!certFile.exists()) {
       qDebug()<<"The certificate file doesn't exist";
       return QSslCertificate();
    }

    if(!certFile.open(QIODevice::ReadOnly)) {
        qDebug()<<"Can't open certificate file";
        return QSslCertificate();
    }

    QByteArray certData = certFile.readAll();

    QSslCertificate sslCert(certData);

    if(sslCert.isNull()) {
        qDebug("The certificate has no content");
        return QSslCertificate();
    }

    return sslCert;
}

QSslKey sslKey()
{
    QFile keyFile("C:/Program Files/OpenSSL-Win64/bin/client-2048.key");

    if(!keyFile.exists()) {
       qDebug()<<"The key file doesn't exist";
       return QSslKey();
    }

    if(!keyFile.open(QIODevice::ReadOnly)) {
        qDebug()<<"Can't open key file";
        return QSslKey();
    }

    QByteArray keyData = keyFile.readAll();

    QSslKey sslKey(keyData, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey);

    if(sslKey.isNull()) {
        qDebug("The key has no content");
        return QSslKey();
    }

    return sslKey;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QNetworkAccessManager manager;

    QNetworkRequest request;

    QByteArray payload("username=myusername&password=mypassword");
    QString url("https://identitysso.betfair.com/api/certlogin");

    QSslConfiguration sslConfig;
    sslConfig.setLocalCertificate(sslCertificate());
    sslConfig.setPrivateKey(sslKey());

    request.setSslConfiguration(sslConfig);
    request.setUrl(url);
    request.setRawHeader("X-Application", "myappkey");
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    qDebug()<<manager.post(request, payload)->readAll();

    return a.exec();
}

Вывод данной программы следующий:
The certificate has no content
The key has no content
""
qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

Необходимо заметить, что я полный чайник в этом OpenSSL и слабо понимаю, что здесь происходит. Делал это по гайдам и документации Betfair API.

Много чего гуглил по данной проблеме, поэтому скажу, что возможно, у меня не так:
1. Ничего не прописано в файле .pro по OpenSSL
2. Я использую компилятор MinGW 7.3.0 32-bit, а OpenSSL, с помощью которого у меня сделан сертификат и ключ, 64-bit
3. Не добавлены какие-то либы OpenSSL в какие-то Qt-шные файлы или в файл проекта

Пожалуйста, скажите, как мне сделать так, чтобы все работало прекрасно и легко, как на Python))
Заранее благодарен!

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

8
Алексей Внуков
  • 26 лютого 2020 р. 17:58

TLS initialization failed - говорит что приложению не хватает библиотек OpenSSL, просто скопируйте их и положите рядом с исполняемым файлом

    v
    • 26 лютого 2020 р. 18:13
    • (відредаговано)

    Добавил в папку проекта следующие либы, ничего не изменилось.
    Папка проекта

    Надо что-то где-то дополнительно прописывать или нет? Я просто не очень понимаю...

      ВЖ
      • 27 лютого 2020 р. 03:00

      положи их рядом с исполняемым файлом (.exe) в папке сборки

        Алексей Внуков
        • 27 лютого 2020 р. 03:24

        только смотри разрядность твоей сборки и разрядность библиотек, они должны совпадать, если приложение 64-х битное то и библиотеки должны быть 64-х битными и т.д.

          v
          • 27 лютого 2020 р. 03:25

          Положил в Build файл, результат не изменился.

            v
            • 27 лютого 2020 р. 03:26
            • (відредаговано)

            Вот да...У меня 32-битный MinGW. Значит, мне надо делать сертификат и ключ через 32-битный OpenSSL, да?
            Ну и соответственно либы оттуда брать...

              v
              • 27 лютого 2020 р. 04:53

              Я скачал Qt-шный 32-битный OpenSSL из Maintenance Tool, сгенерировал новый сертификат и ключ, добавил 32-битные либы в сборку проекта и изменил пути сертификата и ключа на новые. Из вывода вышеуказанной программы ушли строчки:
              The certificate has no content
              The key has no content
              qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

              Но в качестве ответа на запрос приходит по-прежнему почему-то пустая строка. Проверял новые сертификаты на Python, все работает. Может я как-то неправильно запрос отправляю или ответ считываю как-то не так?...

                v
                • 27 лютого 2020 р. 09:00
                • Відповідь була позначена як рішення.

                Проблема решилась путем следующих манипуляций:
                1. Небольшое изменение url (на https://identitysso-cert.betfair.com/api/certlogin)
                2. Установки OpenSSL 32-bit (разрядность должна соответствовать разрядности компилятора)
                3. Генерации сертификата и закрытого ключа указанного выше OpenSSL
                4. Добавления libcrypto-1_1.dll и libssl-1_1.dll в папку сборки проекта

                Всем спасибо!

                P.S. Также очень важно работать с ответом запроса только после того, как получен сигнал QNetworkAccessManager::finished, иначе получится чтение ответа до момента его получения от сервера.

                  Коментарі

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  sf

                  C++ - Тест 004. Указатели, Массивы и Циклы

                  • Результат:90бали,
                  • Рейтинг балів8
                  МВ

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:68бали,
                  • Рейтинг балів-1
                  ЛС

                  C++ - Тест 001. Первая программа и типы данных

                  • Результат:53бали,
                  • Рейтинг балів-4
                  Останні коментарі
                  A
                  ALO1ZE19 жовтня 2024 р. 08:19
                  Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь Максимов05 жовтня 2024 р. 07:51
                  Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas505 липня 2024 р. 11:02
                  QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  k
                  kmssr08 лютого 2024 р. 18:43
                  Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  АК
                  Анатолий Кононенко05 лютого 2024 р. 01:50
                  Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  Тепер обговоріть на форумі
                  J
                  JacobFib17 жовтня 2024 р. 03:27
                  добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                  ИМ
                  Игорь Максимов03 жовтня 2024 р. 04:05
                  Реализация навигации по разделам Спасибо Евгений!
                  JW
                  Jhon Wick01 жовтня 2024 р. 15:52
                  Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                  КГ
                  Кирилл Гусарев27 вересня 2024 р. 09:09
                  Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                  F
                  Fynjy22 липня 2024 р. 04:15
                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                  Слідкуйте за нами в соціальних мережах