2014-02-07 267 views
10

我遇到問題。我製作了一個連接到https站點的Qt應用程序。 在我的工作機器上,一切正常。當我嘗試測試我一個乾淨的Windows 7機器上的應用程序,我發現了以下問題:Qt&SSL,握手失敗

我已經安裝了新鮮的Win7機(安裝所有更新)後,開始我的應用程序後,我收到了SSL握手失敗錯誤,SIGNAL(sslErrors(QNetworkReply *,QList))與兩個空錯誤字符串一起發出並且錯誤= QSslError :: NoError。 我真的在搜尋整天爲什麼發生這種情況,也可以用examples \ network \ securesocketclient \ release \ securesocketclient和domain「google.com」重現它。

現在,我發現,一旦我啓動了訪問https://www.google.com的Internet Explorer,我的應用程序也按預期工作,並且不會再出現握手錯誤。

順便說一句,您訪問哪個網站並不重要 - 這與google.com無關。

有人可以向我解釋爲什麼會發生這種情況嗎?這是OpenSSL或Qt中的一個錯誤嗎?

UPDATE

我找到了一種生活在這個問題我自己,實現以下忽略邏輯:

QSslError ignoreNOErrors(QSslError::NoError); 

foreach(QSslError error, errors) 
    if(error.error() != QSslError::NoError) 
     qDebug() << error.errorString(); 

QList<QSslError> expectedSslErrors; 
expectedSslErrors.append(ignoreNOErrors); 
reply->ignoreSslErrors(expectedSslErrors); 

感謝

+0

好吧,似乎沒有人有一個好主意。如何使用http://qt-project.org/doc/qt將GeoTrust(https://www.geotrust.com/resources/root-certificates/)中的根證書添加到套接字的CA證書數據庫中-4.8/qsslsocket.html#addCaCertificate?至少,這聽起來像是一個合理的解決方法。任何想法? – inspector

回答

11

你可以忽略證書驗證使用QSslConfiguration :: setPeerVerifyMode():

QSslConfiguration conf = request.sslConfiguration(); 
conf.setPeerVerifyMode(QSslSocket::VerifyNone); 
request.setSslConfiguration(conf); 
+0

會發生什麼?我在嘗試連接到遠程地址時遇到此問題,但對本地主機正常工作。 –

1

我在使用Qt 5.5和5.6的Mac上遇到了同樣的問題。當我升級到5.7時就解決了。希望如果你仍然面臨這個問題,它可能會有所幫助。