QSslError:证书是自签名的,不受信任

时间:2012-04-10 22:15:22

标签: c++ qt ssl qnetworkaccessmanager

我正在尝试向证书自签名的网络服务发送休息请求。目前我正在创建请求,设置网址和身份验证。键作为标题。然后我告诉回复忽略这个ssl错误:

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

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

当我运行它时,我收到以下ssl错误:

  

9 - 证书是自签名的,不受信任的

后面是网络错误nr 6:

  

请求失败并显示消息:SSL握手失败

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

如果有人知道我做错了什么,真的很感激!

编辑:

更改为:

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

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

2 个答案:

答案 0 :(得分:4)

  

证书是自签名的,不受信任的

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

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

但您也可以通过将信号sslError()连接到一个插槽来手动忽略该错误,在该插槽中检查错误列表仅包含自签名证书错误,然后调用ignoreSslErrors()(不带任何参数) )。

答案 1 :(得分:0)

阅读文档,您需要做的是在响应QNetworkReply :: sslErrors信号的插槽上调用ignoreSslErrors