具有CA证书的.p12文件是否可以在C#中使用,而无需将其导入证书存储中

问题描述 投票:1回答:1

我得到了一个带有3个证书的.p12证书文件。其中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 core时是否必须将CA证书安装到证书存储中?或者是否有一种使其表现得像使用来自p12文件的证书的curl一样的方法?

Wireshark卷曲:Whireshark when making call with curl

Wireshark .net核心:Wireshark when making call with .net core

c# curl .net-core certificate x509certificate
1个回答
1
投票

简短的回答:否*。

Wordier简介:SslStreamClientCertificates集合中选择一个证书,使用的数据是(过去,但不再普遍)由TLS服务器发送的有关适当根的数据(如果不适用,则选择HasPrivateKey为真的第一件事)。在选择过程中,将单独检查每个候选证书,并要求系统解析链。在Windows上,然后将选定的证书发送到系统库,以显示“我们正在执行TLS”,这是限制的来源(IIRC)。 (.NET Core的macOS和Linux版本只是尝试保持行为均等)

一旦选择了证书,就可以最后一次确定要在握手中包括哪些证书的过程,而无需从ClientCertificates集合中获取任何其他上下文。

如果知道集合代表一个链,最好的答案是将CA元素导入用户的CertificateAuthority存储中。该存储区不授予对CA证书的任何信任,它实际上只是在构建链时使用的缓存。

而且,您不需要PersistKeySet,也可能不需要MachineKeySet:What is the rationale for all the different X509KeyStorageFlags?

var handler = new HttpClientHandler();

using (X509Store store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadWrite);

    var certs = new X509Certificate2Collection();
    certs.Import(@"Swish_Merchant_TestCertificate_1234679304.p12", "swish", X509KeyStorageFlags.DefaultKeySet);

    foreach (X509Certificate2 cert in certs)
    {
        if (cert.HasPrivateKey)
        {
            handler.ClientCertificates.Add(cert);
        }
        else
        {
            store.Add(cert);
        }
    }
}

var client = new HttpClient(handler);
...

*如果您的系统已经导入了CA链,那么它将起作用。或者,如果CA链使用Authority Information Access扩展发布CA证书的可下载副本,则链引擎将找到它,并且一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.