【问题标题】:How should I use a certificate with HttpClient?我应该如何在 HttpClient 中使用证书?
【发布时间】:2019-11-10 14:11:36
【问题描述】:

我需要使用我们的合作伙伴之一提供的 Web API。他们的 API 要求我使用证书进行连接。

我不想在我们的服务器 (VM) 上安装证书。这对我们的凤凰服务器策略适得其反。

我尝试以编程方式使用证书。问题是我得到一个错误:

AuthenticationException:根据验证程序,远程证书无效。

我使用此代码创建了我的HttpClient

_certificate = new X509Certificate2(_certificateFile);
var handler = new WebRequestHandler();
handler.ClientCertificates.Add(_certificate);
var client = new HttpClient(handler) { BaseAddress = new Uri(_url) };

我可以通过覆盖证书验证使其工作:

ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

但这看起来风格很糟糕。

我已验证我的端点与证书中的 CN 匹配

AuthenticationException 仅仅是因为证书没有安装在证书存储区吗?

如果是,我可以暂时用代码安装证书并在之后将其删除吗?

【问题讨论】:

    标签: c# windows-10 certificate httpclient


    【解决方案1】:

    “远程证书无效”表示 .NET Framework 认为您合作伙伴的 Web 服务的服务器端证书无效(如果您没有安装必要的根/中间证书,这很正常)。

    您可以通过更改 ServerCertificateValidationCallback 来禁止默认检查,但您应该实施自己的检查以确保以合理的方式验证他们的证书以避免攻击。

    您还应该使用HttpClientHandler.ServerCertificateValidationCallback,以便您的自定义验证器仅在此特定HttpClient 实例的范围内生效,而不会影响您应用中的其他地方,

    https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.servercertificatecustomvalidationcallback?view=netframework-4.8

    但是,他们给您的证书(通常是客户端证书)由他们的 Web 服务验证,而不是在您的计算机本地验证。

    【讨论】:

    • 谢谢。我不知道如何验证服务器证书?您对如何开始有任何指示吗?或者是否有可能获得更多关于 .net 认为证书无效的信息?
    • @TorbenNielsen,在该领域工作的微软工程师已经写了一个答案stackoverflow.com/questions/57755028/…
    猜你喜欢
    • 2018-06-12
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多