c# - 在 C# 中使用 HttpClient 的客户端证书

标签 c# dotnet-httpclient client-certificates x509certificate2

想要从 Windows 应用程序向服务器机器发送带有客户端证书(.p12 或 .pfx)的数据,Windows 应用程序在 .Net Framework 4.6 中开发,操作系统是 windows 10。

当使用客户端证书(.p12 或 .pfx)从 postman 点击时 [在设置选项卡中加载 -> 添加客户端证书 -> 输入主机名,选择 pfx 文件,输入密码],一切正常(客户端证书发送到服务器机器), 但从下面的 c# 代码发出,

X509Certificate2 certificate = new X509Certificate2(certificateFilePath, "password");
WebRequestHandler handler = new WebRequestHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateValidationCallback = (a, b, c, d) => { return true; };
handler.ClientCertificates.Add(certificate);


HttpClient request = new HttpClient(handler);
request.DefaultRequestHeaders.Add("User-Agent", UserAgent);
// added other headers and data
var result = request.PostAsync(url, byteContent).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;

同时与 fiddler 交叉检查 Postman hit 和 c# hit。

当服务器没有收到客户端证书时,返回403错误。

最佳答案

HttpStatus 代码 403 可能是由 TLS 问题引起的,因为未使用预期的服务器 TLS 版本调用 API。您可以从代码行 string resultContent = result.Content.ReadAsStringAsync().Result;

检查 resultContent 的结果

要设置 SslProtocol,您可以像这样设置 Handler(如果您的目标是 .Net 4.7 或 .Net 核心)

WebRequestHandler handler = new WebRequestHandler();
handler.SslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls;

或在应用层使用 ServicePointManager 启动方法(或 .Net framework 4.7 之前的版本)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls13 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

旁注建议 - 我建议您使用纯异步/等待模式。不要通过调用 .Result 对 IO 请求使用同步调用。

关于c# - 在 C# 中使用 HttpClient 的客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58254150/

相关文章:

c# - Windows Developer Preview C# 版本 - 缺少功能?

c# - 使用 FormCollection 中的数据发出异步 HttpClient 发布请求

c# - Polly 记录所有带有 URL、 header 、内容和响应的请求

c# - 如何使用 HttpClient 在 Web api 中传递 header 值

javascript - 通过 JavaScript 发送客户端证书。

c# - 在文本框输入方面需要帮助

c# - 尽管有 TryCatch 事件,异常仍从工作流中逃逸

c# - 如何读取字节数组中的每第三位

php - 使用客户端证书进行身份验证

java - 如何从 Tomcat 的特定主机获取签名者证书?