【问题标题】:QSslError: The certificate is self-signed, and untrustedQSslError:证书是自签名的,不受信任
【发布时间】:2012-04-23 05:53:03
【问题描述】:

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

但还是出现同样的错误...

【问题讨论】:

    标签: c++ qt ssl qnetworkaccessmanager


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 提供证书是什么意思?它是一个 base64 编码的字符串,是身份验证的一部分。标题。不确定如何将其作为证书提供
    • @chikuba 您所描述的看起来更像是基本身份验证,而不是证书。该文档显示了如何将证书从文件here 传递给QSslError,并获取该文件,使用服务器上的浏览器,当您单击挂锁时,您应该能够下载/导出证书。
    • 没有证书,挂锁被越过了。该站点不受信任。认为当您使用自签名时,您不需要证书
    • 自签名网站有证书,但它未经已知权威机构(如威瑞信)验证,仅由网站所有者验证。如果您信任站点所有者并且您通过安全的方式获得了证书(所以,不是我写的方法:)),它与权威签名证书一样安全。
    • 即使挂锁被越过,您也可以下载证书(在带有example的站点的chrome上它可以工作)。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2015-10-28
      • 2018-04-16
      • 1970-01-01
      • 2015-11-02
      • 2013-02-08
      • 2011-01-13
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多