簡體   English   中英

如何讓Qt 5.8在Windows上使用OpenSSL

[英]How to get Qt 5.8 working with OpenSSL on Windows

我試圖讓Qt 5.8在Windows上使用OpenSSL,但每次我向前邁出一步,我都會遇到另一個更大的對象。

編輯/更新:此錯誤僅在調試模式下發生!

這是我到目前為止的設置:

  • 安裝Qt 5.8
  • 已下載和編譯的OpenSSL版本
  • 將小型測試項目轉移到MSVS2015
  • 將dll文件(libeay32.dll和ssleay32.dll)復制到應用程序目錄
  • SSL連接現在正常工作

但問題是:每當我打開連接時是否使用SSL,我都會因退出應用程序而出錯。 拋出異常(ntdll.dll)。

錯誤消息,調用堆棧,...

我使用Visual Leak Detector測試了我的代碼,因為我認為這是一個內存問題,但它並沒有解決我的問題。 我不知道我應該在哪里開始......

這是Qt Creator 4.2.1中的一個小例子,它也不起作用

這是我的代碼(當我刪除OpenSSL dll時,它適用於http):

void InfoGatherer::getInfo(QString name)
{
    // TODO: Search for the name and select right page
    QUrl url = QUrl(name);
    data.clear();

    QNetworkRequest *request = new QNetworkRequest(url);
    request->setRawHeader("User-Agent", userAgent);

    if (name.startsWith("https"))
    {
        QSslConfiguration sslConfiguration(QSslConfiguration::defaultConfiguration());
        sslConfiguration.setProtocol(QSsl::TlsV1_2OrLater);
        request->setSslConfiguration(sslConfiguration);
    }
    else
    {
        // TODO: Try to get https
    }

    reply = webCtrl->get(*request);

    connect(reply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(slotError(QNetworkReply::NetworkError)));
    connect(reply, SIGNAL(finished()), this, SLOT(onReplyFinished()));

    // Mem leaks (Visual Leak Detector)
    if(!name.startsWith("https"))
        webCtrl->deleteResource(*request);

    delete request;
}

void InfoGatherer::onReadyRead()
{
    data.append(reply->readAll());
}

void InfoGatherer::slotError(QNetworkReply::NetworkError)
{
    // TODO
    qWarning() << "ErrorNo: " << reply->error() << "for url: " << reply->url().toString();
    qDebug() << "Request failed, " << reply->errorString();
    qDebug() << "Headers:" << reply->rawHeaderList() << "content:" << reply->readAll();
}

void InfoGatherer::onReplyFinished()
{
    QString html = QString(data);

    emit got_webpage(&html);
}

Qt正確檢測OpenSSL庫:

qDebug() << "Support SSL:  " << QSslSocket::supportsSsl()
        << "\nLib Version Number: " << QSslSocket::sslLibraryVersionNumber()
        << "\nLib Version String: " << QSslSocket::sslLibraryVersionString()
        << "\nLib Build Version Number: " << QSslSocket::sslLibraryBuildVersionNumber()
        << "\nLib Build Version String: " << QSslSocket::sslLibraryBuildVersionString();
  • 支持SSL:true
  • Lib版本號:268443791
  • Lib Version字符串:“OpenSSL 1.0.2h 2016年5月3日”
  • Lib Build版本號:268443791
  • Lib Build Version String:“OpenSSL 1.0.2h 2016年5月3日”

也許你可以從slproweb.com嘗試為OpenSSL 構建Windows二進制文件。 此外,似乎Qt 5.8需要OpenSSL v1.0.2才能正常工作。

解:

再次從OpenSSL構建所有dll,不要忘記構建調試dll。

是一個如何構建dll的非常好的鏈接。 構建64位正常和調試版本!

從腳注使用: - nmake -f ms \\ nt dll .mak(install)獲取dll的

並且不要將dll重命名為libeay64.dll和ssleay64.dll。

這適合我。 只是請求的局部變量。

QUrl imageUrl = QUrl (link);
QNetworkRequest request (imageUrl);

/* SSL Configuration */
QSslConfiguration sslConfiguration = request.sslConfiguration();
sslConfiguration.setPeerVerifyMode (QSslSocket::VerifyNone);
sslConfiguration.setProtocol (QSsl::AnyProtocol);
request.setSslConfiguration (sslConfiguration);
networkAccessMgr->get (request);
  • 驗證對等模式: QSslSocket::VerifyNone
  • 協議: QSsl::AnyProtocol

暫無
暫無

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

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