Qt https请求报错SSL handshake failed 解决思路方法

先执行下面代码

cpp 复制代码
    qDebug() << manager.supportedSchemes();
    bool bSupp = QSslSocket::supportsSsl();
    auto buildVersion = QSslSocket::sslLibraryBuildVersionString();
    QString version = QSslSocket::sslLibraryVersionString();
    qInfo() << bSupp << buildVersion << version ;

输出

说明当前环境是支持ssl,在确认当前环境qt支持openssl的情况下,我正常调用

cpp 复制代码
    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

我尝试换了种方法请求

cpp 复制代码
    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可以打印支持哪些曲线

cpp 复制代码
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明确指定算法

cpp 复制代码
ssl_ecdh_curve x25519:

我试了不行,最后我再次对比了两个服务器的nginx配置,发现请求不同的多配置了下面这个东西,就是服务器的算法优先

cpp 复制代码
ssl_prefer_server_ciphers on;

我关掉试试?

成了!

就是这个ssl_prefer_server_ciphers on导致的,给我害苦了。。。。。。。。。。

相关推荐
初阳7857 小时前
【基于Qt5仿音乐播放器(六)】——细节打磨与总结
qt·1024程序员节
伤心的梧桐叶13 小时前
商品大图断点续传后打不开,先看是不是把完整响应又接了一遍
http·https
小鱼仙官17 小时前
使用Qt封装C/C++ 动态库 用于第三方调用
c语言·c++·qt
扶尔魔ocy19 小时前
【QT OpenGL】知识点编目及传送门
qt·opengl·osg
qq_4017004120 小时前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
我命由我1234520 小时前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee
GreenHandBruce20 小时前
基于Qt 6.12.0 + FFmpeg 9.0.2的4k视频播放器
qt·ffmpeg·音视频
2501_9159214320 小时前
iOS 实时日志怎么看?KeyMob 的日志过滤、崩溃报告与符号化
android·ios·小程序·https·uni-app·iphone·webview
誰能久伴不乏1 天前
桌面客户端的运行日志系统:SQLite 分块 + 独立写线程 + 文本降级
数据库·c++·qt·架构·sqlite
沫璃染墨2 天前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3