Qt https请求报错SSL handshake failed 解决思路方法
先执行下面代码
qDebug() << manager.supportedSchemes();
bool bSupp = QSslSocket::supportsSsl();
auto buildVersion = QSslSocket::sslLibraryBuildVersionString();
QString version = QSslSocket::sslLibraryVersionString();
qInfo() << bSupp << buildVersion << version ;
输出
说明当前环境是支持ssl,在确认当前环境qt支持openssl的情况下,我正常调用
QNetworkAccessManager manager;
QNetworkRequest request;
request.setUrl(url);
QString hexString;
for (const QString& value : dataList) {
hexString = hexString + value;
}
hexString = hexString.mid(8);
QByteArray byteArray2 = QByteArray::fromHex(hexString.toUtf8());
QNetworkReply* reply = manager.post(request, byteArray2);
QEventLoop loop;
QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
// 检查错误
if (reply->error() != QNetworkReply::NoError) {
qDebug() << "请求失败:" << reply->errorString();
} else {
qDebug() << "请求成功";
qDebug() << "响应:" << reply->readAll();
}
// 清理
reply->deleteLater();
忽略ssl证书校验进行请求(上面代码省略),报错SSL handshake failed
我尝试换了种方法请求
QSslSocket sslSocket;
sslSocket.connectToHostEncrypted("192.168.0.169", 10669);
if (sslSocket.waitForEncrypted()) {
qDebug() << "SSL connection established!";
} else {
}
报了141A4132:SSL routines:tls_process_ske_ecdhe:bad ecpoint 类似这样的错误
似乎可以确定是什么曲线算法有问题了。
我以为是我的openssl版本有问题,下载了1.1.1k ,1.1.1u 还有最新的3系列版本,都不行
不能一直僵着,我尝试请求另一台服务器,我发现可以请求过去!!!!
然后这时候搜到一篇博文
https://blog.csdn.net/xiaojun081004/article/details/140035579
这个给了我启发,基本可以确定这个算法不一样导致握手失败了,既然不一样,那就得找到哪里不一样啊
然后开始抓包,源码面前,了无秘密
这块是客户端告诉服务端它支持的算法
然后服务端会挑一个它也支持的给客户端,就是这个x25519,这个x25519是成功的
另一台不成功的返回的是x448这个算法,
既然这样,我想着,我把x488屏蔽不就可以了,supportedEllipticCurves可以打印支持哪些曲线
qDebug() << manager.supportedSchemes();
QVector<QSslEllipticCurve> curves;
foreach(const QSslEllipticCurve &curve, sslConfig.supportedEllipticCurves()) {
qDebug() << "当前支持曲线1=" << curve.longName();
}
curves.push_back(QSslEllipticCurve::fromShortName("x25519"));
sslConfig.setEllipticCurves(curves);
支持的都打印出来,没有x488,也没有x25519,见鬼,然后不服输,下载了qt的源码,也没有发现哪里赋值了x488 x25519
如果是默认的,就用,如果我自己添加,就没有。。。。。。。
没办法了,尝试从服务端入手,gpt告诉我可以在nginx明确指定算法
ssl_ecdh_curve x25519:
我试了不行,最后我再次对比了两个服务器的nginx配置,发现请求不同的多配置了下面这个东西,就是服务器的算法优先
ssl_prefer_server_ciphers on;
我关掉试试?
成了!
就是这个ssl_prefer_server_ciphers on导致的,给我害苦了。。。。。。。。。。