QSsl错误:证书是自签名的,不受信任

QSslError: The certificate is self-signed, and untrusted

本文关键字:信任 错误 证书 QSsl      更新时间:2023-10-16

我正在尝试向证书自签名的Web服务发送休息请求。目前,我正在创建一个请求,将 url 和 auth.key 设置为标头。然后我告诉回复忽略这个 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);

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

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

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

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

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

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