2017-05-18 102 views
0

我們正試圖完全控制允許QNetworkRequest允許使用哪些CA證書。我們想要運行的第一個「簡單」測試是刪除所有CA證書,並確保它在任何https嘗試中觸發並出錯。在Qt中,如何從QNetworkRequest中刪除所有證書頒發機構證書?

這裏是展示我們如何設置情況下,最小的例子:

QNetworkAccessManager manager; 
QUrl requestedUrl("https://www.google.com"); 
QNetworkRequest request(requestedUrl); 

QSslConfiguration sslConfig = request.sslConfiguration(); 
// Set the QList of certificates to an empty list 
sslConfig.setCaCertificates({}); 
request.setSslConfiguration(sslConfig); 

QNetworkReply *reply = manager.get(request); 
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), 
     this, SLOT(slotSslErrors(QList<QSslError>))); 

我們預期在運行時失敗,因爲請求故意沒有任何CA證書,以完成認證。但是請求實際上已成功完成,回覆中包含網頁內容,並且不會執行插槽。

如何實際上禁用所有證書的這種請求?

回答

1

無論您設置哪種CA證書,都應該在SSL握手之前完成。

http://doc.qt.io/qt-5/qsslconfiguration.html#setCaCertificates

那麼可能是你可能需要調用void QNetworkAccessManager::connectToHostEncrypted並設置QSslConfiguration對象,調用

QNetworkReply *reply = manager.get(request); 

http://doc.qt.io/qt-5/qnetworkaccessmanager.html#connectToHostEncrypted

嘗試類似下面前:

QSslConfiguration sslConfig = request.sslConfiguration(); 
// Set the QList of certificates to an empty list 
sslConfig.setCaCertificates({}); 
request.setSslConfiguration(sslConfig); 

//ONCE YOU SET THE CONFIG ESTABLISH HAND SHAKE 
manager.connectToHostEncrypted("....",..,sslConfig); 


QNetworkReply *reply = manager.get(request); 
+0

謝謝你的回答。我在文檔中看到了pre-handshake要求,我的理解是,當您不明確調用QNetworkAccessManager連接方法之一時,握手會在您發出請求時發生(例如,在例)。無論如何,我嘗試按照您的建議將調用添加到'connectToHostEncrypted',並且行爲保持不變。 –

相關問題