从存储中加载X509Certificate2证书链

4

我有一个包含3个密码保护的证书(链式结构)的文件(.p12),我已经将其安装在我的商店上。 我正在尝试将它们加载到我的代码中。 我从文件中加载它们的方法如下:

 var clientCert = new X509Certificate2(@"myfile.p12", "mypassword");

如何从存储中加载数据并获得相同的结果?
我尝试过:
var computerCaStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
computerCaStore.Open(OpenFlags.ReadOnly); 
var certificates = computerCaStore.Certificates.OfType<X509Certificate2>().ToLi‌​st(); 
var certFromStore = certificates.Single(c => c.Thumbprint == thumbprintMerchant);
var newCert = new X509Certificate2(certFromStore.RawData, "mypassword");

如果第一行代表您的代码,则clientCert不是3个证书链接在一起,而只是具有私钥的证书。第二行无法产生您展示的错误,因此显然还有更多上下文。比如,您如何首先获得了certFromStore - bartonjs
当我在商店中导入相同的文件时,我会得到3个证书,但是当我从代码中加载它时,它只有一个带有私钥的证书。那么我如何从商店中获取相同的证书呢?这是我如何从商店中加载它们的:`var computerCaStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);computerCaStore.Open(OpenFlags.ReadOnly);var certificates = computerCaStore.Certificates.OfType().ToList(); var clientCertificat1 = certificates.Single(c => c.Thumbprint == thumbprintMerchant);`我使用指纹。 - Gabriel Andrei
请编辑问题以提供上下文。您在评论中提供的示例代码与问题不符,这使得对任何事情进行推理变得困难。 - bartonjs
@GabrielAndrei 你是如何解决这个问题的? - wandos
@wandos 如果我没记错的话,我最终是将RawCertData(https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate.getrawcertdata(v=vs.110).aspx)保存在数据库中,并通过这种方式加载证书,而不是使用Store。 - Gabriel Andrei
1
@GabrielAndrei 我使用了 certFromStore 而不是创建一个新的证书,这样就可以工作了。 - wandos
1个回答

2

certFromStore应该等同于clientCert,最后一行是导致问题的原因。

X509Certificate2上的RawData属性返回证书的DER编码值,而不是原始文件字节。证书没有私钥,所以最后一行将其剥离。您之前提到了TLS异常的问题,那是因为您的证书不再具有私钥。

如果certFromStore.HasPrivateKey为false,则放置证书到存储中的操作没有按照您的预期进行。具有私钥的证书出现在根存储中相当不寻常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接