Как найти сертификат по его отпечатку пальца в C#


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

пожалуйста, скажите мне, где я делаю неправильно в нем.

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string certThumbPrint = "‎‎fe14593dd66b2406c5269d742d04b6e1ab03adb1";
            X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            // Try to open the store.

            certStore.Open(OpenFlags.ReadOnly);
            // Find the certificate that matches the thumbprint.
            X509Certificate2Collection certCollection = certStore.Certificates.Find(
                X509FindType.FindByThumbprint, certThumbPrint, false);
            certStore.Close();

            // Check to see if our certificate was added to the collection. If no, 
            // throw an error, if yes, create a certificate using it.
            if (0 == certCollection.Count)
            {
                Console.WriteLine("Error: No certificate found containing thumbprint " );
            }
            Console.ReadLine();
}
7 72

7 ответов:

просто наткнулся на этот вопрос, когда гуглил по той же проблеме, и нашел ответ здесь: если, как и я, вы получили свой "исходный" отпечаток пальца из MMC, выделив отпечаток пальца и скопировав его в буфер обмена, вы почти наверняка поймали невидимый символ в начале экрана, так что:

string certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

на самом деле

строка certThumbPrint = "невидимый символfe14593dd66b2406c5269d742d04b6e1ab03adb1";

Если вы удалите этот невидимый символ (вы можете сказать, что он есть, когда вы нажимаете backspace или удаляете рядом с ним, и ничего не происходит), или просто повторите отпечаток пальца вручную, ваш код должен работать нормально. Теперь, если бы только в Visual Studio была опция "Показывать невидимые символы"...

строковый литерал, содержащий отпечаток вашего пальца, имеет метка слева направо в начале. Когда MMC перечисляет свойства сертификата, он предшествует значению отпечатка с этим символом, так что шестнадцатеричные байты перечислены слева направо даже в тех местах, где текст обычно отображается справа налево.

вероятно, это был ярлык, который кто-то взял, потому что было проще добавить символ к одному из значений в списке свойств, чем написать немного кода динамическое обновление стиля элемента управления редактирования. Возможно, это было быстрое исправление сообщения об ошибке во время тестирования локализации.

в MMC метка слева направо имеет ненулевую ширину, которую вы можете наблюдать, наблюдая за перемещением курсора, когда вы стреляете по нему, и я замечаю, что первая строка шестнадцатеричных байтов немного сдвинута вправо по сравнению со второй строкой.

в других редакторах, таких как Visual Studio, метка слева направо не имеет ширины, но вы все равно можете наблюдать ее заметив, что курсор не перемещается, когда вы стрелка поперек есть. Как ответил Кенд, удаление этого символа решает проблему.

быстрый способ определить невидимый символ: С помощью клавиатуры выберите невидимый символ; затем вставьте его в слово между некоторыми обычными символами. Выберите его в Word; затем нажмите вставить > символ > дополнительные символы. Посмотрите в левом нижнем углу под "Unicode name".

чтобы убедиться, что эти символы LTR "\u200e" и RTL "\u200f" удаляются из строки отпечатка пальца сделайте следующее

thumbprint = thumbprint.Replace("\u200e", string.Empty).Replace("\u200f", string.Empty).Replace(" ",string.Empty);

последняя строка заменить для удаления пробелов не является полностью необходимым, как он находит мой сертификат с или без них.

другие проблемные символы юникода можно найти здесь

таблица кодировки UTF-8 и символы Юникода

мои два цента: я скопировал значение в MMC и вставил его в VS с включенными пробелами.

в начале не было ничего, кроме пробела в конце: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

сейчас, в интернете.конфигурационный файл я вставил значение, сохраняя все пробелы внутри, удаляя последнее пространство: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Это прекрасно работает.

Если я использую "1e52730d0029e6857be623e2fac7a508ac365e57", удаляя пространство внутри, как я вижу в других сообщениях, не работает...

надеюсь, что это может помочь ;)

Я сделал следующее, Чтобы удалить лишний символ, а также удалить все остальное, что не является допустимым шестнадцатеричным (и ToUpper его):

            thumbprint = Regex.Replace(thumbprint.ToUpper(), @"[^0-9A-F]+", string.Empty);

Это позволило мне скопировать отпечаток пальца прямо из диалогового окна CERT manager и вставить его прямо в мое использование.

Я смог решить проблему, написав консольное приложение, которое извлекает все сертификаты на сертификат и выводит идентификатор отпечатка пальца. Я скопировал вывод консоли и вставил отпечаток пальца точно. Никакой вопрос. Похоже, копирование из консоли MMC вызывает проблемы, даже если данные выглядят похожими. Я использовал этот сайт в качестве отправной точки для чтения всем сертификаты.

https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.thumbprint(v=vs. 110).aspx

Я запускаю этот скрипт powershell, чтобы получить все отпечатки пальцев и перенаправить вывод в текстовый файл и скопировать отпечаток оттуда.

Get-ChildItem -path cert:\LocalMachine\My

чтобы перенаправить вывод в текстовый файл используйте это:

Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt