gpt4 book ai didi

c# - 为什么我在附加客户端证书时得到 "Could not create SSL/TLS secure channel"?

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:35 27 4
gpt4 key购买 nike

当我的代码尝试向服务器发送请求时,我看到此消息,该服务器要求请求附有客户端证书及其私钥(这可能是 unusual situation ) .使用通过 SoapUI 发送的请求,我已验证证书有效。我的代码是否可能以错误的方式附加了证书?

代码看起来像这样(它可能包含很多在寻找难以捉摸的解决方案时不需要的东西):

// build stuff
var httpClientHandler = new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
ClientCertificateOptions = ClientCertificateOption.Manual
};
var certificate = new X509Certificate(certName, password, X509KeyStorageFlags.UserKeySet);
httpClientHandler.ClientCertificates.Add(certificate);
var request = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = new StringContent(requestBody, Encoding.UTF8, "application/xml")
};
var httpClient = new HttpClient(httpClientHandler);
httpClient
.DefaultRequestHeaders
.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

// Enable protocols
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;

// fire! (here's where the exception is thrown)
var response = await httpClient.SendAsync(request).ConfigureAwait(false);

最佳答案

此实例中的问题在于证书 - 特别是私钥。

我使用的是 .cer 证书,它的行为不同于 .pfx 文件。 SoapUI 和 curl 都可以与 .cer 一起正常工作,但加载 .cer 的 C# 代码会丢失私钥。 (为什么我们连接到的服务器需要私钥是一个不同的问题——我的理解是它不应该——感谢对此的任何想法。)同样,.cer 文件通过加载到商店MMC 管理单元也丢失了私钥。我还没有找出原因。

虽然我最初将 .pfx 文件加载到证书存储区是成功的,但当我开始在不同的帐户下运行我的应用程序时,返回了“无法创建 SSL/TLS 安全通道”错误 (解释 herehere )。本质上,证书存储将私钥保存在一个文件系统位置,只有将证书加载到存储中的用户才能访问。

相反,我直接从文件系统加载证书,如下所示:

var certBytes = File.ReadAllBytes(certFileName);
var certificate = new X509Certificate2(certBytes, password, X509KeyStorageFlags.Exportable);

var httpClientHandler = new HttpClientHandler();
httpClientHandler.ClientCertificates.Add(certificate);
var request = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = new StringContent(requestBody, Encoding.UTF8, "application/xml")
};

var httpClient = new HttpClient(httpClientHandler);

httpClient
.DefaultRequestHeaders
.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

// fire!
var response = await httpClient.SendAsync(request).ConfigureAwait(false);

关于c# - 为什么我在附加客户端证书时得到 "Could not create SSL/TLS secure channel"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54585446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com