Приложение C ++ Qt работает, но выдает предупреждение «qt.network.ssl: QSslSocket: не удается разрешить SSLv2_server_method» - PullRequest
0 голосов
/ 13 января 2019

Я написал приложение C ++ Qt (QtCreator версии 4.8 на основе Qt 5.12.0), работающее на Linux mint версии 18.3, которое использует QNetworkAccessManager и связанные с ним классы. Это в основном клиентское приложение Betfair HTTPS, которое связывается с серверами Betfair. У меня установлен openSSL (версия 1.0.2g).

В основном мое приложение работает отлично, но я получаю qt.network.ssl: QSslSocket: не могу разрешить SSLv2_server_method (дважды) на вкладке вывода приложения в QtCreator. Я могу успешно войти в систему и взаимодействовать с API - все выглядит и ведет себя хорошо! Я даже использовал wireshark для проверки пакетов, которые наверняка выглядят зашифрованными.

Я видел другие ответы здесь и в Интернете, в которых говорится, что Ubuntu поставляет openSSL с отключенным openSSLv2 из-за нестабильности и рекомендаций по перекомпиляции с включенным openSSLv2. Но так как мое приложение действительно работает, я не уверен, нужно ли это?

По сути, мой вопрос заключается в том, каковы последствия этого предупреждения для моего программного обеспечения (которое работает точно так, как задумано) в отношении безопасности? Я действительно не хочу игнорировать предупреждение, не зная, для чего оно. Я знаю только основы работы SSL, поэтому немного не знаю, как действовать дальше.

РЕДАКТИРОВАТЬ: Некоторые ответы привели меня к обнаружению, что предупреждение срабатывает в момент, когда QSslKey создается из моего файла ключей. Фактический код, вызывающий это:

QByteArray keydata = kfile.readAll();
QSslKey pkey(keydata,QSsl::Rsa);   // Warning fires after this line executed
if(pkey.isNull()) {
    qWarning("The key has no content.");
}

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Все второстепенные версии TLSv1.2, такие как TLSv1.0 и SSLv1.0, SSLv2.0 устарели и не должны больше использоваться или поддерживаться. Поскольку существует множество серверов и клиентов, которые не указывают свои минимальные требования для версии TLS, Ubuntu отключила эти действительно старые и небезопасные протоколы. Вы можете прочитать больше об этом здесь: TLSv1.1 должен умереть умереть умереть .

В зависимости от версии QNetworkManager / Qt, которую вы используете, например, такой оператор должен убрать предупреждение и значительно повысить безопасность шифрования защищенного сокета.

QNetworkRequest request(url);
QSslConfiguration config = request.sslConfiguration();
config.setProtocol(QSsl::TlsV1_2);
0 голосов
/ 16 января 2019

Боюсь, я не могу дать вам полный ответ, но я могу дать вам материал для расследования.

В папке установки Qt проверьте файл qtnetwork-config.h Он содержит флаги, которые будут включать / отключать код Qt code в зависимости от пакетов вашей платформы, доступных на момент конфигурирования Qt (с помощью / qtsrc / configure) или сборки в вашей системе.

Пример моего файла qtnetwork-config.h:

#define QT_FEATURE_networkinterface 1
#define QT_FEATURE_bearermanagement 1
#define QT_FEATURE_ftp 1
#define QT_FEATURE_http 1
#define QT_FEATURE_localserver 1
#define QT_FEATURE_networkdiskcache 1
#define QT_FEATURE_networkproxy 1
#define QT_NO_OPENSSL true
#define QT_FEATURE_sctp -1
#define QT_NO_SCTP 
#define QT_FEATURE_socks5 1
#define QT_FEATURE_ssl -1
#define QT_NO_SSL 
#define QT_FEATURE_udpsocket 1

Если ваши пакеты ssl изменились после того, как вы собрали Qt (например, вы обновили / понизили или удалили некоторые ...), эти настройки будут по-прежнему действительны? Я не уверен Что происходит, когда вы развертываете предварительную сборку Qt? ...

Это может быть исследовано дальше. В любом случае, чтобы узнать, что вызывает предупреждение, установите обработчик сообщений:

// put this in main.cpp for instance
void myMessageOutput(QtMsgType type, const QMessageLogContext &/*context*/, const QString &msg)
{
    if (msg.contains("cannot resolve SSLv2_server_method"))
    {
        qDebug() << "put a breakpoint here and look in the stack trace where you are";
    }
}
// put this in int main(int argc, char ** argv) for instance
qInstallMessageHandler(myMessageOutput);

Запустите ваше приложение в режиме отладки со сборкой Qt в отладке из исходного кода. Вам нужно нажать на точку останова в обработчике сообщений и увидеть источник сообщения.

...