2013-02-18 58 views
13

我已將我的證書導入到個人 - >證書。通過序列號找不到證書

我用下面的代碼行來查找序列號我的證書,但我不能:

public X509Certificate2Collection FindCerts(string serialNumber) 
    { 
     var searchType = X509FindType.FindBySerialNumber; 
     var storeName = "MY"; 

     var certificatesStore = new X509Store(storeName, StoreLocation.LocalMachine); 
     certificatesStore.Open(OpenFlags.OpenExistingOnly); 

     var matchingCertificates = certificatesStore.Certificates.Find(searchType, serialNumber, true); 

     certificatesStore.Close(); 

     return matchingCertificates; 
    } 

你能告訴我,爲什麼我找不到我的證書,即使它是在certificatesStore 。證書列表?

注:我的證書被轉到爸爸

回答

17

我已經通過輸入序列號,而不是從屬性窗口複製固定的這個問題。我不知道爲什麼從這個窗口複製時,它在序列號的開始處包含一個奇怪的字符。

+6

可以確認此問題。屬性窗口中的序列號前面有一個字符。當被複制到VS時,它不可見,但它在那裏。 – randoms 2014-03-19 09:12:22

0

創建如果您確定有關證書在計算機存儲中存在,你可以嘗試給第三個參數查找()爲「假」?

+0

我試圖找到()爲'假'已經但它不工作。在嘗試調試時,我在certificatesStore.Certificates集合中看到了我的證書:certificatesStore.Certificates [2]正是我想要查找的內容。 – Phuc 2013-02-18 05:04:50

+0

您是否可以在同一家商店或其他商店購買任何其他證書?你能否嘗試獲得使用不同方法創建的證書(例如,使用'makecert'工具)? ''makecert -r -len 2048 -a sha256 -n「CN = Test」-sr LocalMachine -sk test_key1 -ss My' 希望你給沒有任何空格的序列號... – hasmit 2013-02-18 05:21:34

+0

是的,在「我的」商店中有7個證書,我可以獲得其中的一些證書,使用此方法無法找到GoDaddy證書。 – Phuc 2013-02-18 05:43:12

0

證書序列號是一個二進制數據序列,表示一個無限長的int值。如果你在某處看到了文本,這可能意味着文本被寫爲串行OR(更可能),你看到Base64或Base16編碼的二進制序列。在後一種情況下,您不會直接找到它 - 您需要解碼串行並嘗試這種方式。

0

如果你正在試圖提取的證書■通過GoDaddy的發行/,你可以使用這個:

var certificateStore= new X509Store(StoreLocation.LocalMachine); 
certificateStore.Open(OpenFlags.ReadOnly); 
var certificates = certificateStore.Certificates; 
foreach (var certificate in certificateStore) 
      { 
       if (certificate.Issuer.Contains("GoDaddy")) 
       { 
0

確保serialNumber是大寫字符串。 sn小寫時,我遇到了一些查找證書的問題。如果從證書的詳細信息窗口複製sn,還要刪除空格

6

因爲我碰到這個問題太大,我試圖做一個變通方法能夠複製從certmgr.msc

彙總值粘貼我所做的:

// The value below is pasted from certmgr.msc 
var sslCertificateSerialNumber="‎47 9f da c4 ad d7 33 a6 4c ad 54 d3 d9 95 67 1c"; 


// Remove all non allowed characters that entered the value while copy/paste 
var rgx = new Regex("[^a-fA-F0-9]"); 
var serial = rgx.Replace(sslCertificateSerialNumber, string.Empty).ToUpper(); 

現在我找到了具有複製/粘貼值的正確證書。

0

昨天我遇到了類似的問題,花了好幾個小時試圖找出爲什麼地球上沒有找到現有的證書。似乎Certificates.Find方法執行區分大小寫的搜索。我採用了String.Compare的遞歸方法。

X509Certificate2 storedCert = null; 
for (int i = 0; i < store.Certificates.Count; i++) 
{ 
    if (String.Compare(store.Certificates[i].SerialNumber, MySerialNum, true) == 0) 
    { 
     storedCert = store.Certificates[i]; 
     break; 
    } 
} 
0

要按照序列號查找,從由mmc管理單元報告的序列開始,刪除所有空格和大寫所有字母。爲我工作。這會給你類似的東西...

008CC59B72BE954F93F1435F6B86227600