【问题标题】:How to ignor self signed certificates with System.Net.Http.HttpClient in Universal Windows App如何在通用 Windows 应用程序中使用 System.Net.Http.HttpClient 忽略自签名证书
【发布时间】:2016-01-16 01:45:12
【问题描述】:

我正在创建一个可移植类库,这意味着据我所知,我必须使用 System.Net.Http.HttpClient 来调用我的 Web API。挑战在于,对于我的通用 Windows 应用程序,由于 API 服务器可以拥有自签名证书这一事实,我无法弄清楚如何忽略返回的错误。任何建议将不胜感激。

更新:我无法导入任何证书,因为这将是一个在各种组织的各种设备上运行的应用程序,让他们将自签名证书导入到运行该应用程序的每台设备上是不切实际的。

【问题讨论】:

    标签: uwp portable-class-library dotnet-httpclient self-signed


    【解决方案1】:

    因为System.Net.ServicePointManager.CertificatePolicy 在 UWP 中不可用,所以不是一个选项。如果你改用Windows.Web.Http.HttpClient,那么你可以ignore self signed certificates

    更新:

    再想一想,如果将自签名证书错误添加到应用程序的根证书中,则可以忽略它。

    两种选择:

    • 使用 API 安装它:

      IBuffer buffer = await FileIO.ReadBufferAsync(file);
      Certificate rootCert = new Certificate(buffer); 
      CertificateStore rootStore = CertificateStores.TrustedRootCertificationAuthorities;
      rootStore.Add(rootCert);
      
    • 将它包含在您的Package.appxmanifest > 声明 > 证书 > 添加并设置:

      • 商店名称:root
      • 内容:证书文件路径

    使用这两个选项中的任何一个,您都将停止获得:

    System.Net.WebException:底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系。 ---> System.Security.Authentication.AuthenticationException: 根据验证程序,远程证书无效。

    【讨论】:

    • 对不起,我在问题中并不清楚这一点,但我无法导入任何证书,因为这将是一个在各种组织的各种设备上运行的应用程序,让他们导入自签名证书是不切实际的到运行应用程序的每台设备上。我已更新问题以反映这条信息。
    • 不确定我是否理解您的应用无法添加根证书的原因。但是应用程序会将证书添加到商店,而不是用户,他们永远不会知道。并且根证书将仅对应用程序有效,而不是对整个用户帐户或系统有效。不便之处在于您需要在构建时将根证书与应用程序打包在一起,或者您需要在执行时以某种方式(可能使用不同且有效的 HTTPS 服务器)传输证书。但这绝对比忽略 SSL 错误更安全。忽略 SSL 错误可能与没有 SSL 相同
    • 更正了问题以表明 API 服务器不是我的。 API 服务器将托管在每个客户的站点上,每个客户都将拥有自己的证书,该证书可能是自签名的,也可能是受信任的证书。这就是我无法导入证书的原因,
    • @kiewic 对于System.Net.Http.HttpClient 也有这样的解决方法吗?我测试了您的第二个选项,但没有成功。
    • @Benni 这个解决方案应该适用于两个 nanmespaces,你在哪个版本的 Windows 上运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 2018-07-18
    • 2022-01-03
    • 2012-09-23
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多