Як знайти сертифікат за його відбитком у 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оператором.
Алекс Валлехо

Відповіді:


208

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

рядок certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

насправді

Рядок certThumbPrint = " INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1";

Якщо ви видалите цей невидимий символ (ви можете сказати, що він є там, коли натискаєте клавішу Backspace або видаляєте поруч із ним, і нічого, здається, не відбувається), або просто передрукуєте відбиток від руки, ваш код повинен працювати нормально. Тепер, якби у Visual Studio була опція "показати невидимих ​​символів" ...


2
VS має «Правка»> «Додатково»> «Перегляд пробілу» (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, позначка зліва направо не має ширини, але ви все одно можете спостерігати за нею, помічаючи, що курсор не рухається, коли стрілка поперек є. Як відповів KenD, видалення цього символу вирішує проблему.

Швидкий спосіб ідентифікації невидимого символу: Виберіть невидимого символа за допомогою клавіатури; потім вставте його в Word між деякими звичайними символами. Виберіть його в Word; потім натисніть Вставити> Символ> Інші символи. Подивіться внизу ліворуч у розділі "Ім'я Юнікоду".


10

щоб переконатися, що ці LTR "\ u200e" і RTL "\ u200f" символи видалено з вашого рядка відбитка пальця, виконайте наступне

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

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

інші клопітні символи Unicode можна знайти тут

Таблиця кодування 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

Дякую за це! Я вже мав сертифікат і просто не знав його. Це відкрило те, що мені потрібно було знати.
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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.