C# 使用 httpclient 发出 https 请求

Posted

技术标签:

【中文标题】C# 使用 httpclient 发出 https 请求【英文标题】:C# making https request with httpclient 【发布时间】:2017-06-08 17:32:44 【问题描述】:

UPD:此代码适用于 windows server 2012,但不适用于 windows 7、8、10。我也不知道为什么

我正在尝试向某些仅允许 https 连接的服务发出发布请求。但我得到错误

The request was aborted: Could not create SSL/TLS secure channel

我的代码

using (var client = new HttpClient())

    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
    var response = await client.PostAsync(ApiAddress, content);
    var xml = await response.Content.ReadAsStringAsync();

    var transaction = DeserializeXml<StationsResponseTransaction>(xml);
    return transaction;

此服务提供证书 (.crt) 和私钥 (.pem) 文件。也许我需要使用这些文件?但是怎么做呢?

更新: 我尝试创建 pfx 证书并将其添加到 WebRequestHandler

WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = new X509Certificate2("Certificate.pfx", "password");
handler.ClientCertificates.Add(certificate);

并在客户端使用处理程序new HttpClient(handler)

但我遇到了同样的错误

更新:刚刚在邮递员中测试了这个请求 - 工作正常,当服务器的证书从谷歌 crhome 接受时。但是如何接受来自 C# httpclient 的证书呢?

ServicePointManagerServerCertificateValidationCallback 事件未调用

【问题讨论】:

证书是否使用受信任的根证书(甚至是您自己生成的)签名? 可能服务器不支持您需要的协议或密码。您可以通过 ssllabs 检查:ssllabs.com/ssltest @Jasen 我不知道,我也不知道该怎么做 您基本上使用 Powershell 1)创建签名证书 2)将证书安装到您的受信任证书 3)创建您的应用程序使用的(第二个)证书,由受信任证书签名. 我以前用过这个人的指南:blog.davidchristiansen.com/2016/09/… 【参考方案1】:

从您的 .pfx 制作 .cer 文件,然后将其安装到本地的受信任文件夹中。 然后从.pfc制作客户端.cer,并在解决方案中使用(不要安装它)。

【讨论】:

以上是关于C# 使用 httpclient 发出 https 请求的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# HttpClient 不能调用这个 URL(总是超时)?

来自 C# HttpClient 针对 Spring 服务器 JWT 令牌的身份验证

C# HttpClient 带证书https 请求

使用 HttpClient PostAsync 发送 C# NameValueCollection 问题

C# HttpClient 不发送 POST 变量

Xamarin 中的 WebException,使用 HttpClient