2017-05-18 32 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証明書を持っていないと私たちは、それが実行時に失敗することが期待されます。しかし、要求は実際に正常に完了し、応答にはWebページのコンテンツが含まれ、slotSslErrorsスロットは実行されません。

どのように実際にそのような要求のためのすべての証明書を無効にするでしょうか?

答えて

1

設定しているすべてのCA証明書は、SSLハンドシェイク前に実行する必要があります。

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

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

だから、おそらくあなたは

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

以下のようなものを試してみてください

QNetworkReply *reply = manager.get(request); 
を呼び出す前に、void QNetworkAccessManager::connectToHostEncryptedを呼び出し、QSslConfigurationオブジェクトを設定する必要があるかもしれません
+0

あなたの答えをありがとう。私はdocでpre-handshakeの必要条件を見ました。私の理解は、 'QNetworkAccessManager'接続メソッドの1つを明示的に呼び出さなければ、要求を発行するときにハンドシェイクが起こるということです。例)。とにかく、提案したように 'connectToHostEncrypted'への呼び出しを追加しようとしましたが、動作は変わりません。 –

関連する問題