2017-04-07 166 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爲假,那麼無論您如何將證書放入商店,都無法按照您認爲的方式進行操作。具有私鑰的證書位於根存儲中是非常不尋常的。