簡體   English   中英

C ++ Qt應用程序正常運行,但發出警告“ qt.network.ssl:QSslSocket:無法解析SSLv2_server_method”

[英]C++ Qt application working but gives warning “qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method”

我編寫了一個在Linux Mint版本18.3上運行的C ++ Qt應用程序(基於Qt 5.12.0的QtCreator版本4.8),該應用程序使用QNetworkAccessManager和相關類。 它基本上是與Betfair服務器通信的Betfair HTTPS客戶端應用程序。 我已經安裝了openSSL(版本1.0.2g)。

基本上,我的應用程序運行正常,但是我得到了qt.network.ssl:QSslSocket:無法在QtCreator的應用程序輸出選項卡上解析SSLv2_server_method (兩次)。 我能夠成功登錄並與API交互-一切看起來和行為都很好! 我什至使用Wireshark來檢查確實看起來已加密的數據包。

我在這里和網上都看到了其他答案,他們說Ubuntu由於不穩定而帶有禁用的openSSLv2的openSSL以及建議在啟用了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.");
}

恐怕我不能給您完整的答案,但是我可以給您一些材料進行調查。

在Qt安裝文件夾中,檢查文件qtnetwork-config.h。該文件包含用於啟用/禁用代碼Qt代碼的標志,具體取決於在配置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

如果您在構建Qt之后更改了ssl軟件包(例如,您已升級/降級或刪除了某些...),這些設置仍然有效嗎? 我不確定 部署預構建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從源代碼進行調試來在調試中運行您的應用程序。 您應該在消息處理程序中點擊斷點,然后查看消息的來源。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM