В Qt как удалить все сертификаты центров сертификации из QNetworkRequest?
Мы пытаемся получить полный контроль над тем, какие сертификаты CA QNetworkRequest
будет разрешено использовать. Первый "простой" тест, который мы хотели запустить, состоял в том, чтобы удалить все сертификаты CA и убедиться, что он срабатывает и выдает ошибку при любой попытке https.
Вот минимальный пример, показывающий, как мы настраиваем экземпляры:
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 для завершения аутентификации. Но запрос фактически завершается успешно, ответ содержит содержимое веб-страницы, а slotSslErrors
слот не выполнен.
Как можно отключить все сертификаты для такого запроса?
1 ответ
Независимо от того, какие сертификаты CA вы устанавливаете, это должно быть сделано до рукопожатия SSL.
http://doc.qt.io/qt-5/qsslconfiguration.html
Так что, возможно, вам нужно позвонить void QNetworkAccessManager::connectToHostEncrypted
и установить QSslConfiguration
объект, перед вызовом
QNetworkReply *reply = manager.get(request);
http://doc.qt.io/qt-5/qnetworkaccessmanager.html
Попробуйте что-то вроде ниже:
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);