【发布时间】:2020-08-23 21:32:48
【问题描述】:
我有一个 .p12 证书文件,其中包含 3 个证书。其中2个是CA证书。
如果我使用 curl(Win10 上为 7.70),我可以: curl -s -S -i --cert Swish_Merchant_TestCertificate_1234679304.p12:swish --cert-type p12 --tlsv1.2 --header "Content-Type:application/json" https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests --data-binary @jsondata.json
Curl 连接服务器时会使用 p12 文件中的 CA 证书。
另一方面,如果我尝试在 .net core (3.1) 中执行类似操作,则会失败并显示错误消息“收到的消息意外或格式错误。”
var handler = new HttpClientHandler();
var certs = new X509Certificate2Collection();
certs.Import(@"Swish_Merchant_TestCertificate_1234679304.p12", "swish", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
foreach (var cert in certs)
{
handler.ClientCertificates.Add(cert);
}
var client = new HttpClient(handler);
var url = "https://mss.cpc.getswish.net/swish-cpcapi/api/v1/paymentrequests";
var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Post,
};
request.Content = new StringContent(System.IO.File.ReadAllText(@"jsondata.json"), Encoding.UTF8, "application/json");
request.Headers.Add("accept", "*/*");
var response = await client.SendAsync(request);
使用 Wireshark 我看到 curl 从 p12 文件发送所有三个证书,而 .net 核心只发送一个。见下图。
如果我将 CA 证书安装到“当前用户”的“个人证书”中,那么 .net 核心也会发送所有三个证书并且它可以工作。
问题:我是否必须在使用 .net 核心时安装 CA 证书(到证书存储中),或者有没有办法让它像 curl 一样使用 p12 中的证书文件?
【问题讨论】:
标签: c# curl .net-core certificate x509certificate