Подтвердить что ты не робот

Не удается найти сертификат по серийному номеру

Я импортировал свои сертификаты в Личные → Сертификаты.

Я использую следующие строки кода, чтобы найти свой сертификат по серийному номеру, но не могу:

    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;
    }

Не могли бы вы рассказать мне, почему я не могу найти свой сертификат, даже если он находится в списке сертификатовStore.Certificates?

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

4b9b3361

Ответ 1

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

Ответ 2

Так как я наткнулся на эту проблему, я попытался сделать обходной путь, чтобы иметь возможность скопировать вставку значения из 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();

Теперь я нашел правильный сертификат с копией/вставленным значением.

Ответ 3

Если вы уверены в наличии сертификата в хранилище машин, можете ли вы попробовать указать третий параметр Find() как "false"?

Ответ 4

Серийный номер сертификата представляет собой двоичную последовательность данных, которая обозначает большой int неограниченной длины. Если вы где-то видели текст, это может означать, что либо текст был записан как последовательный ИЛИ (что более вероятно), что вы видите двоичный последовательный код Base64 или Base16. В последнем случае вы не найдете его прямолинейным способом - вам нужно декодировать сериал и попробовать это.

Ответ 5

Если то, что вы пытаетесь извлечь, это сертификат/выдается 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"))
                {

Ответ 6

Убедитесь, что serialNumber - это строчная строка. У меня возникли проблемы с поиском сертификатов, когда sn был в нижнем регистре. Также удалите пробелы, если вы скопируете sn из окна сведений о сертификате

Ответ 7

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

См. этот вопрос для получения дополнительной информации: Магазин X509 не может найти сертификат по SerialNumber

Ответ 8

Вчера я столкнулся с подобной проблемой и провел несколько часов, пытаясь выяснить, почему на самом деле существующий сертификат не найден. Кажется, что метод 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;
    }
}

Ответ 9

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

008CC59B72BE954F93F1435F6B86227600