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->setPeerVerifyMode(QSslSocket::VerifyNone)
吗?【参考方案2】:
我在使用 Qt 5.5 和 5.6 的 Mac 上遇到了同样的问题。当我升级到5.7时,它就解决了。如果您仍然面临这个问题,希望它可能会有所帮助。
【讨论】:
知道问题在 5.9.4 中是否仍然存在吗?【参考方案3】:看看这个 Qt bug
[这是 SO :D 的填充]
【讨论】:
以上是关于Qt & SSL,握手失败的主要内容,如果未能解决你的问题,请参考以下文章