2017-04-07 171 views
2

我有一个文件(.p12),其中包含3个证书(链接在一起)受密码保护,我已在我的商店中安装。 我试图将它们加载到我的代码中。 我从文件加载它们的方法是这样的:从商店加载X509证书2证书链

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"); 
+0

如果第一行代表您的代码,那么'clientCert'不是3个证书链,而只是具有私钥的证书。第二行不能产生你显示的错误,所以显然有更多的上下文。比如,你是如何获得'certFromStore'的。 – bartonjs

+0

当我在商店中导入同一个文件时,我得到3个证书,但是从代码加载它时,它是带有私钥的证书。那么我怎么能从商店里得到同样的结果呢? 这是我如何从商店加载它们: 'var computerCaStore = new X509Store(StoreName.Root,StoreLocation.LocalMachine); computerCaStore.Open(OpenFlags.ReadOnly); \t \t \t \t var certificates = computerCaStore.Certificates.OfType ()。ToList(); \t \t \t \t变种clientCertificat1 = certificates.Single(C => c.Thumbprint == thumbprintMerchant);' 我使用的指纹 –

+0

请编辑上下文的问题。评论中的示例代码与该问题不匹配,因此很难推理任何事情。 – bartonjs

回答

1

certFromStore应相当于clientCert,最后一行是什么打破你。

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

如果certFromStore.HasPrivateKey为假,那么无论您如何将证书放入商店,都无法按照您认为的方式进行操作。具有私钥的证书位于根存储中是非常不寻常的。