Qt & SSL,握手失败

Posted

技术标签:

【中文标题】Qt & SSL,握手失败【英文标题】:Qt & SSL, Handshake failed 【发布时间】:2014-03-05 09:28:41 【问题描述】:

我有问题。我制作了一个连接到 https 站点的 Qt 应用程序。 在我的工作机器上,一切正常。当我尝试在干净的 Windows 7 机器上测试我的应用程序时,我发现了以下问题:

在我安装了新的 Win7 机器(安装了所有更新)后,在启动我的应用程序后,我收到 SSL Handshake failed 错误,SIGNAL(sslErrors(QNetworkReply* ,QList)) 发出两个空错误字符串和 error = QSslError::NoError。 我真的整天都在寻找为什么会发生这种情况,也可以用 examples\network\securesocketclient\release\securesocketclient 和域“google.com”重现它。

现在,我发现,一旦我启动 Internet Explorer 访问 https://www.google.com,我的应用程序也会按预期工作,并且不会出现进一步的握手错误。

顺便说一句,您访问的网站无关紧要 - 这与 google.com 无关。

有人可以向我解释为什么会这样吗?这是 OpenSSL 或 Qt 中的错误,还是两者都有?

更新

我为自己找到了解决这个问题的方法,实现了以下忽略逻辑:

QSslError ignoreNOErrors(QSslError::NoError);

foreach(QSslError error, errors)
    if(error.error() != QSslError::NoError)
        qDebug() << error.errorString();

QList<QSslError> expectedSslErrors;
expectedSslErrors.append(ignoreNOErrors);
reply->ignoreSslErrors(expectedSslErrors);

谢谢

【问题讨论】:

好吧,似乎没人有好主意。使用qt-project.org/doc/qt-4.8/qsslsocket.html#addCaCertificate 将根证书(例如来自 GeoTrust (geotrust.com/resources/root-certificates) 的根证书添加到套接字的 CA 证书数据库中怎么样?至少,这听起来像是一个合理的解决方法。有什么想法吗? 【参考方案1】:

您可以使用 QSslConfiguration::setPeerVerifyMode() 忽略证书验证:

QSslConfiguration conf = request.sslConfiguration();
conf.setPeerVerifyMode(QSslSocket::VerifyNone);
request.setSslConfiguration(conf);

【讨论】:

发生了什么?当我尝试连接到远程地址时遇到此问题,但它对 localhost 工作正常。 你不能在不获取 ssl 配置的情况下做 sslSocket-&gt;setPeerVerifyMode(QSslSocket::VerifyNone) 吗?【参考方案2】:

我在使用 Qt 5.5 和 5.6 的 Mac 上遇到了同样的问题。当我升级到5.7时,它就解决了。如果您仍然面临这个问题,希望它可能会有所帮助。

【讨论】:

知道问题在 5.9.4 中是否仍然存在吗?【参考方案3】:

看看这个 Qt bug

[这是 SO :D 的填充]

【讨论】:

以上是关于Qt & SSL,握手失败的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“SSL 握手失败”

ClientHello 后 SSL 握手失败

Paypal ssl 握手失败

javax.net.ssl.SSLHandshakeException:在 Android 7.0 中握手失败

Kafka SSL 握手失败问题

SVN - 握手失败:SSL 错误