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 的证书呢?
ServicePointManager
的ServerCertificateValidationCallback
事件未调用
【问题讨论】:
证书是否使用受信任的根证书(甚至是您自己生成的)签名? 可能服务器不支持您需要的协议或密码。您可以通过 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 令牌的身份验证