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就安分了。