Поиск сертификатов C # - почему не работает серийный из Win view Tool - PullRequest
1 голос
/ 31 января 2012

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

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

var certSerial = "‎18 99 ac c2 1e ed 69 ae"; //copied from Windows Certificates view tool
certSerial = certSerial.Replace(" ", string.Empty).ToUpper();
var foundCerts = store.Certificates.Find(
         X509FindType.FindBySerialNumber,
         certSerial ,
         true);

... и ничего не нашел. Однако затем я посмотрел на это хранилище в режиме отладки и скопировал серийный номер сертификата, который я хотел найти - 1899ACC21EED69AE, и изменил переменную certSerial на:

var certSerial = "1899ACC21EED69AE";

возвращает мне правильный сертификат. В Debug обе переменные выглядят одинаково - что я должен сделать, чтобы первый код работал? Я просто не понимаю, почему так себя ведет.

Ответы [ 2 ]

2 голосов
/ 16 октября 2013

Я получил эту же самую проблему сегодня и нашел другое решение:

        var store = new X509Store(StoreLocation.CurrentUser);
        store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        var certificates = store.Certificates;
        X509Certificate2 match = null;
        foreach(var item in certificates)
        {
            if (item.SerialNumber != null && item.SerialNumber.Equals(serial, StringComparison.InvariantCultureIgnoreCase))
            {
                match = item;
                break;
            }
        }

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

match.Verify()

Похоже, у метода Find возникли проблемы с культурой .....

Извините за мой плохой английский, и надеюсь, что это кому-нибудь поможет.

2 голосов
/ 31 января 2012

Как объясняется в FindBySerialNumber , серийный номер должен быть в обратном порядке, поскольку он является целым числом.

Введите строку еще раз:

var certSerial = "‎18 99 ac c2 1e ed 69 ae";

Когда явставьте его в мой редактор, который я получил:

var certSerial = "?18 99 ac c2 1e ed 69 ae";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...