HttpClient 使用自签名证书调用 HTTPS WebApi

Posted

技术标签:

【中文标题】HttpClient 使用自签名证书调用 HTTPS WebApi【英文标题】:HttpClient call HTTPS WebApi with self-signed certificate 【发布时间】:2014-11-17 10:03:19 【问题描述】:

在我们的开发阶段,我们创建了一个自签名证书,这意味着我有.cer.pfx 文件。当我们尝试调用 API 时,是否可以使用任何方法将上述文件嵌入 HTTPS 请求中,以便不是每个客户端都将证书安装到本地受信任的证书存储中。

这可能吗?我发现了一些 API,看起来我们可以这样做,但就是无法成功:

try

    var secure = new SecureString();
    foreach (char s in "password")
    
        secure.AppendChar(s);
    

    var handler = new WebRequestHandler();
    handler.ClientCertificateOptions = ClientCertificateOption.Manual;
    handler.UseProxy = false;

    var certificate = new X509Certificate2(@"C:\httpstest2.pfx", secure);
    handler.ClientCertificates.Add(certificate);

    using (var httpClient = new HttpClient(handler))
    
        httpClient.BaseAddress = new Uri("https://www.abc.com");
        var foo = httpClient.GetStringAsync("api/value").Result;
        Console.WriteLine(foo);
    

catch (Exception ex)

    Console.WriteLine(ex);

    是否需要使用X509Certificate 而不是X509Certificate2? 如果我们从第三方公司购买真正的证书,我们是否可以不关心证书问题只通过验证异常?

【问题讨论】:

【参考方案1】:

您可以使用此代码忽略任何 SSL 错误

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

显然要确保它不会投入生产。

【讨论】:

不,我们想避免这种情况,只是打算为验证问题找到真正的解决方案。 概念验证应用程序的完美解决方案。谢谢! 如果您在返回 true 之前检查自己的证书,我看不出使用自定义验证回调有什么不好的地方。我猜回调甚至可以用来覆盖操作系统的验证,这可能更安全,因为您不会信任安装在您机器上的其他(根)CA 的证书。您可能希望在更本地的范围内配置它:***.com/a/24225737/3172599【参考方案2】:

客户端只需要 .cer 文件中的公钥,该公钥在建立 https 连接时自动发送。但是客户端是否信任该证书并不是应该允许发送证书的服务器做出的决定。

您可以使用组策略将证书分发给您的客户端。详情请见http://technet.microsoft.com/en-us/library/cc770315(v=ws.10).aspx。

【讨论】:

以上是关于HttpClient 使用自签名证书调用 HTTPS WebApi的主要内容,如果未能解决你的问题,请参考以下文章

使用 Httpclient 信任自签名证书

HttpClient 拒绝发送自签名客户端证书

httpclient 和自签名证书的问题

HttpClient 无法忽略或绕过自签名证书错误

在 ktor httpClient(js) JS 引擎中忽略自签名证书的配置

找不到 SSL 证书的 Java HttpClient 错误,在代码中使用证书作为字符串?