2013-02-18 2 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 Список сертификатов?

Примечание: мои сертификаты были созданы Go Daddy

ответ

17

Я исправил эту проблему, введя серийный номер вместо копирования из окна свойств. Я не знаю, почему при копировании из этого окна он содержит странный символ в начале серийного номера.

+6

может подтвердить эту проблему. В окне свойств есть символ перед порядковым номером. При копировании на VS это не видно, но его там. – randoms

0

Если вы уверены, что о наличии сертификата в хранилище компьютера, вы можете попытаться дать третий параметр Find() как «ложь»?

+0

Я уже пытался найти() как «ложь», но это не работает. При попытке отладки я вижу свой сертификат в коллекции certStore.Certificates: certStore.Certificates [2] именно то, что я хочу найти. – Phuc

+0

Вы можете получить любой другой сертификат в том же магазине или в другом магазине? Можете ли вы попробовать получить сертификат, созданный с использованием другого метода (например, с помощью инструмента «makecert»)? '> MakeCert -r -len 2048 -a sha256 -n "CN = Test" -sr LocalMachine -sk test_key1 -ss My' Надеюсь, что вы даете серийный номер без пробелов ... – hasmit

+0

Да, вы 7 сертификатов в магазине «MY», я могу получить некоторые из них, сертификаты GoDaddy не могут быть найдены с использованием этого метода. – Phuc

0

Серийный номер сертификата представляет собой двоичную последовательность данных, которая обозначает большой int неограниченной длины. Если вы где-то видели текст, это может означать, что либо текст был записан как последовательный ИЛИ (что более вероятно), что вы видите двоичный последовательный код 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 из окна сведений о сертификате

0

Если вы скопируете из окна свойств сертификата Windows, вы можете случайно скопировать некоторые дополнительные невидимые символы, что приведет к поломке поиска по серийному номеру.

Смотрите этот вопрос для получения дополнительной информации: X509 store can not find certificate by SerialNumber

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

Чтобы найти по серийному номеру, начиная с серийного номера, сообщают ММС в, удалить все пробелы и прописные всех альф. Работал для меня. Это даст вам что-то вроде ...

008CC59B72BE954F93F1435F6B86227600 
Смежные вопросы