v
vlaaad2026. Februar 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

8
Алексей Внуков
  • 26. Februar 2020 17:58

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

    v
    • 26. Februar 2020 18:13
    • (bearbeitet)

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

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

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

        Алексей Внуков
        • 27. Februar 2020 03:24

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

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

            v
            • 27. Februar 2020 03:26
            • (bearbeitet)

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

              v
              • 27. Februar 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. Februar 2020 09:00
                • Die Antwort wurde als Lösung markiert.

                Проблема решилась путем следующих манипуляций:
                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, иначе получится чтение ответа до момента его получения от сервера.

                  Kommentare

                  Nur autorisierte Benutzer können Kommentare posten.
                  Bitte Anmelden oder Registrieren
                  Letzte Kommentare
                  A
                  ALO1ZE19. Oktober 2024 08:19
                  Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь Максимов5. Oktober 2024 07:51
                  Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas55. Juli 2024 11:02
                  QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  k
                  kmssr8. Februar 2024 18:43
                  Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  Jetzt im Forum diskutieren
                  J
                  JacobFib17. Oktober 2024 03:27
                  добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                  JW
                  Jhon Wick1. Oktober 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. September 2024 09:09
                  Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                  F
                  Fynjy22. Juli 2024 04:15
                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                  Folgen Sie uns in sozialen Netzwerken