2014-02-07 269 views
10

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

我已经安装了新鲜的Win7机(安装所有更新)后,开始我的应用程序后,我收到了SSL握手失败错误,SIGNAL(sslErrors(QNetworkReply *,QList))与两个空错误字符串一起发出并且错误= QSslError :: NoError。 我真的在搜寻整天为什么发生这种情况,也可以用examples \ network \ securesocketclient \ release \ securesocketclient和domain“google.com”重现它。

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

顺便说一句,您访问哪个网站并不重要 - 这与google.com无关。

有人可以向我解释为什么会发生这种情况吗?这是OpenSSL或Qt中的一个错误吗?

UPDATE

我找到了一种生活在这个问题我自己,实现以下忽略逻辑:

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); 

感谢

+0

好吧,似乎没有人有一个好主意。如何使用http://qt-project.org/doc/qt将GeoTrust(https://www.geotrust.com/resources/root-certificates/)中的根证书添加到套接字的CA证书数据库中-4.8/qsslsocket.html#addCaCertificate?至少,这听起来像是一个合理的解决方法。任何想法? – inspector

回答

11

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

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

会发生什么?我在尝试连接到远程地址时遇到此问题,但对本地主机正常工作。 –

1

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