2012-04-10 166 views
4

我正在尝试向证书自签名的web服务发送休息请求。目前,我正在创建一个请求,设置url和auth。键作为标题。然后我告诉回复忽略这个SSL错误:当我运行它QSslError:证书是自签名的,而且不受信任

QSslError error(QSslError::SelfSignedCertificate); 
QList<QSslError> expectedSslErrors; 
expectedSslErrors.append(error); 

QNetworkReply *reply = _accessManager.put(request, ""); // no requestbody 
reply->ignoreSslErrors(expectedSslErrors); 

我得到以下SSL错误:

9 - The certificate is self-signed, and untrusted

其次是网络错误NR 6:

Request failed with message: SSL handshake failed

目前我忽略了所有的错误,因为它似乎是唯一可行的。感觉脏。

如果有人知道我在做什么错,我会很感激!

编辑:

更改为:

QList<QSslError> expectedSslErrors; 
expectedSslErrors.append(QSslError::SelfSignedCertificate); 
expectedSslErrors.append(QSslError::CertificateUntrusted); 
reply->ignoreSslErrors(expectedSslErrors); 

但仍然得到同样的错误...

回答

3

The certificate is self-signed, and untrusted

的问题是 “不信任” 的一部分。 您必须提供自签名证书,作为QSslError的第二个参数。

编辑:根据源代码,实际接收到的SSL错误与传递给ignoreSslErrors的错误之间的比较是通过比较错误代码和证书来完成的。
因此,如果OpenSSL返回的错误包含证书(如QSslError::SelfSignedCertificate),则必须始终将证书传递给QSslError构造函数,否则比较将失败。

但是,您也可以通过将信号sslError()连接到插槽来检查错误列表是否仅包含自签名证书错误,然后致电ignoreSslErrors()(不含任何参数),从而手动忽略此错误。

+0

提供证书是什么意思?它是一个base64编码的字符串,它是auth的一部分。头。不确定如何将其作为证书提供 – chikuba 2012-04-11 01:35:35

+0

@chikuba您所描述的看起来更像是基本身份验证,而不是证书。该文档显示了如何将证书从文件[这里](http://qt-project.org/doc/qt-4.8/qnetworkreply.html#ignoreSslErrors-2)传递给'QSslError',并获得文件,请在服务器上使用浏览器,当您点击挂锁时,您应该可以下载/导出证书。 – alexisdm 2012-04-11 01:46:51

+0

没有证书,挂锁交叉。该网站不受信任。认为当您使用自签名时,您并不需要证书 – chikuba 2012-04-11 01:51:05