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导致的,给我害苦了。。。。。。。。。。

相关推荐
九天轩辕4 小时前
HTTPS 通信流程
https
yourkin6665 小时前
HTTPS(下)
服务器·网络协议·https
水瓶丫头站住6 小时前
Qt中QDockWidget的使用方式
开发语言·qt
laimaxgg6 小时前
Qt常用控件之数字显示控件QLCDNumber
开发语言·c++·qt·qt5·qt6.3
牵牛老人8 小时前
Qt开发中出现中文乱码问题深度解析与解决方案
开发语言·qt
Zfox_8 小时前
【QT】信号与槽 & 窗口坐标
开发语言·c++·qt·qt5
进击ing小白11 小时前
Qt程序退出相关资源释放问题
开发语言·qt
OrangeJiuce12 小时前
【QT中的一些高级数据结构,持续更新中...】
数据结构·c++·qt
程序员-King.15 小时前
【接口封装】——13、登录窗口的标题栏内容设置
c++·qt
anddddoooo18 小时前
域内证书维权
服务器·网络·网络协议·安全·网络安全·https·ssl