Qt HTTPS請求阻止劫持數據
忽略證書驗證
我們開發過程中如果需要忽略證書錯誤,可以使用如下方法Ignore SSL Certificates in QT,然而這將導致https的安全功效形同虛設。
方法是在main方法裏添加
QSslConfiguration sslConf = QSslConfiguration::defaultConfiguration();
sslConf.setPeerVerifyMode(QSslSocket::VerifyNone);
QSslConfiguration::setDefaultConfiguration(sslConf);
或
// 禁用校驗
QSslConfiguration config ;
config.setPeerVerifyMode(QSslSocket::VerifyNone);
QNetworkRequest request(url);
request.setSslConfiguration(config);
Fiddler + Proxifier 強大組合
這個組合可以攔截到未做嚴格校驗的應用程序的ssl通信數據,具體操作可參考網絡文章。那麼如何阻擊這種劫持手段呢,下面介紹下Qt下如何防止https數據被竊聽,其實就是隻要嚴格證書校驗就能防住。
Qt HTTPS防竊聽
代碼如下:
// 啓用嚴格校驗
QSslConfiguration config ;
config.setPeerVerifyMode(QSslSocket::VerifyPeer); // QSslSocket::VerifyNone 可禁用校驗
QNetworkRequest request(url);
request.setSslConfiguration(config);
QNetworkReply* reply = networkManager->post(request, data);
connect(reply, SIGNAL(sslErrors(const QList<QSslError>)), this, SLOT(onSslError(const QList<QSslError>)));
// 這裏我們阻止自簽名和主機名不匹配的證書,其他類型暫放行
void Response::onSslError(QList<QSslError> errors)
{
foreach (QSslError error, errors) {
if(error.error() == QSslError::SelfSignedCertificate
|| error.error() == QSslError::HostNameMismatch) {
return;
}
}
QNetworkReply* reply = (QNetworkReply*)sender();
reply->ignoreSslErrors();
}
這樣我們發現有相關SSL錯誤時候,禁止放行數據即可,這下Fiddler就安分了。