QSslSocket

Автор: | 5 июня, 2025

Применение криптографии и SSL в Qt C++: безопасное соединение с использованием QSslSocket

В современном мире практически любое приложение, работающее с интернетом, требует защиты данных. Один из надёжных способов — использование SSL/TLS-соединений. В Qt для этого предусмотрен класс QSslSocket, обеспечивающий защищённую передачу данных.

QSslSocket — это подкласс QTcpSocket, добавляющий поддержку SSL-соединений с помощью библиотеки OpenSSL. Он позволяет шифровать трафик между клиентом и сервером без необходимости вручную реализовывать криптографию.

Что понадобится:

  • Qt 5 или Qt 6 (включая модуль QtNetwork);
  • Установленный OpenSSL;
  • Сертификаты (если ты подключаешься к собственному серверу).

Пример: создание безопасного клиента с QSslSocket

#include <QSslSocket>
#include <QCoreApplication>
#include <QDebug>

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

    QSslSocket* socket = new QSslSocket;

    QObject::connect(socket, &QSslSocket::encrypted, []() {
        qDebug() << "SSL соединение установлено!";
    });

    QObject::connect(socket, &QSslSocket::readyRead, [=]() {
        qDebug() << socket->readAll();
    });

    QObject::connect(socket, &QSslSocket::sslErrors, [=](const QList<QSslError>& errors) {
        for (const QSslError& error : errors)
            qDebug() << "SSL ошибка:" << error.errorString();

        // Временно игнорируем ошибки (НЕ ДЕЛАЙ ЭТО В ПРОДАКШЕНЕ)
        socket->ignoreSslErrors();
    });

    socket->connectToHostEncrypted("example.com", 443);

    if (!socket->waitForEncrypted(5000)) {
        qDebug() << "Ошибка подключения:" << socket->errorString();
    }

    QString request =
        "GET / HTTP/1.1\r\n"
        "Host: example.com\r\n"
        "Connection: close\r\n\r\n";

    socket->write(request.toUtf8());

    return a.exec();
}

Работа с сертификатами

При использовании собственного сервер, можно явно установить сертификат и ключ:

QSslCertificate cert = QSslCertificate::fromPath(":/cert.pem").first();
QSslKey key = QSslKey(QFile(":/key.pem").readAll(), QSsl::Rsa);

socket->setLocalCertificate(cert);
socket->setPrivateKey(key);

// Дополнительные настройки безопасности

socket->setPeerVerifyMode(QSslSocket::VerifyPeer);

// Добавление доверенных CA

QList<QSslCertificate> caList = QSslCertificate::fromPath(":/ca.pem");
socket->addCaCertificates(caList);

Рекомендации по безопасности:

  • Никогда не игнорируй SSL-ошибки;
  • Используй актуальную версию OpenSSL;
  • Проверяй действительность и срок действия сертификатов.

С помощью QSslSocket ты можешь реализовать безопасное SSL/TLS-соединение в C++-приложении на Qt. Это важный шаг в защите данных, особенно при работе с API, финансовыми сервисами и другими чувствительными данными.