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

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

Скажите, пожалуйста, где я делаю не так.

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

Ответ 1

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

string certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

на самом деле

string certThumbPrint = " INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1";

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

Ответ 2

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

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

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

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

Быстрый способ идентификации невидимого персонажа: Используйте клавиатуру для выбора невидимого символа; затем вставьте его в Word между некоторыми нормальными символами. Выберите его в Word; затем нажмите "Вставить" > "Символ" > "Дополнительные символы". Посмотрите в левом нижнем углу под названием "Юникод".

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

Это отлично работает.

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

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

Ответ 5

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

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

Ответ 6

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

Get-ChildItem -path cert:\LocalMachine\My

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

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