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

82

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

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

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();
}
Рати
источник
X509Storeреализует, IDisposableпоэтому его следует использовать с usingоператором.
Alex Vallejo

Ответы:

208

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

строка certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

на самом деле

Строка certThumbPrint = " INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1";

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

KenD
источник
2
VS имеет Edit> Advanced> View White Space (Ctrl + R, Ctrl + W для переключения) - это может помочь, если вы знаете, что искать.
Michael Freidgeim
@MichaelFreidgeim не помогает. VS не показывает скрытые символы, только пробелы.
Георгий Полевой
@MichaelFreidgeim View White Space не отображает эти конкретные невидимые символы, по крайней мере, в VS 2013.
Джереми Кук,
Я тоже попался на выбор и копирование из MMC.
Mötz
3
СВЯТОЙ @% $ @ $ !!! ЭТО ЭПИЧЕСКОЕ. Потрачено впустую, играя с немедленным окном, гадая, почему "Foo" == "Foo" было ложным. Вы, сэр, заслуживаете голоса. БЛАГОДАРЮ ВАС!
Тьяго Силва,
18

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

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

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

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

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

Эдвард Брей
источник
10

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

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

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

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

Таблица кодировки UTF-8 и символы Unicode

охотник на дроу
источник
5

Мои два цента: я скопировал значение в 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», удаление внутреннего пространства, как я вижу в других сообщениях, не сработает ...

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

вулканик
источник
2

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

Get-ChildItem -path cert:\LocalMachine\My

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

Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt
Pradeep
источник
Спасибо тебе за это! У меня уже был сертификат, но я его просто не знал. Это открыло то, что мне нужно было знать.
rjacobsen0
2

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

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

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

Даррен Сэндфорд
источник
0

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

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

Дэвид Вальдес
источник