先执行下面代码

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

输出

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

说明当前环境是支持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

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


我尝试换了种方法请求

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系列版本,都不行

不能一直僵着,我尝试请求另一台服务器,我发现可以请求过去!!!!

然后这时候搜到一篇博文

这个给了我启发,基本可以确定这个算法不一样导致握手失败了,既然不一样,那就得找到哪里不一样啊

然后开始抓包,源码面前,了无秘密

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


这块是客户端告诉服务端它支持的算法

Qt https请求报错SSL handshake failed 解决思路方法_服务端_04


然后服务端会挑一个它也支持的给客户端,就是这个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导致的,给我害苦了。。。。。。。。。。