项目场景:
在一台全新的服务器上使用QNetworkAccessManager对https api发送请求时,各种报错
问题描述
当使用QNetworkAccessManager向https中的api发送请求时,访问失败
例如:
QNetworkReply::SslHandshakeFailedError "SSL handshake failed"
QNetworkReply::UnknownNetworkError "No cipher suites in common"
甚至还有 connection close的情况
原因分析:
要么是ssl配置有问题,要么就是网络配置有问题,也有可能是Qt当前版本也许不支持:
解决方案:
首先,获取一下当前ssl的版本,确认是否安装好:
bool bSupp = QSslSocket::supportsSsl();
auto buildVersion = QSslSocket::sslLibraryBuildVersionString();
QString version = QSslSocket::sslLibraryVersionString();
qInfo() << bSupp << buildVersion << version ;
如果是以下结果,则是没安装好
再确认当前Qt是否支持https
auto list = Manager->supportedSchemes();
for (auto& item : list) {
qInfo() << item;
}
在代码中为QNetworkReply设置以下方法
QSslConfiguration sslConfig = QSslConfiguration::defaultConfiguration();
sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
sslConfig.setProtocol(QSsl::SslProtocol::AnyProtocol);
QSslConfiguration::setDefaultConfiguration(sslConfig);
req.setSslConfiguration(sslConfig);
如果以上设置了还是不行,那么就去openssl官网下载1.1.1版本的openssl,在安装时直接安装到系统目录,即可正常通信。
https://www.openssl.org/source/