2013-02-18 168 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