Jak znaleźć certyfikat według jego odcisku palca w C #

82

Używam tego kodu, aby znaleźć certyfikat na podstawie jego odcisku palca. certyfikat istnieje w menedżerze certyfikatów w osobistym magazynie certyfikatów, ale ten kod nie znajduje tego certyfikatu.

Proszę, powiedz mi, gdzie robię źle.

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();
}
RATHI
źródło
X509Storeimplementuje, IDisposablewięc powinien być używany z usinginstrukcją.
Alex Vallejo

Odpowiedzi:

208

Po prostu natknąłem się na to pytanie, szukając tego samego problemu w Google, i znalazłem odpowiedź tutaj : jeśli, tak jak ja, uzyskałeś „źródłowy” odcisk palca z MMC, podświetlając odcisk kciuka i kopiując go do schowka, prawie na pewno złapałeś niewidoczny znak na początku ekranu, więc:

string certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

jest aktualne

Ciąg certThumbPrint = " INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1";

Jeśli usuniesz ten niewidoczny znak (możesz powiedzieć, że jest tam, gdy naciśniesz klawisz Backspace lub usuń obok niego i nic się nie dzieje) lub po prostu ponownie wpisz ręcznie odcisk palca, kod powinien działać dobrze. Gdyby tylko Visual Studio miało opcję „pokaż niewidoczne znaki” ...

KenD
źródło
2
VS ma Edycja> Zaawansowane> Wyświetl białą przestrzeń (Ctrl + R, Ctrl + W, aby przełączyć) - może pomóc, jeśli wiesz, czego szukać.
Michael Freidgeim,
@MichaelFreidgeim to nie pomaga. VS nie pokazuje ukrytych znaków, tylko spacje.
George Polevoy
@MichaelFreidgeim View White Space nie wyświetla tych konkretnych niewidzialnych znaków, przynajmniej w VS 2013.
Jeremy Cook
Dałem się też nabrać na wybór i skopiowanie z MMC.
Mötz
3
ŚWIĘTE @% $ @ $ !!! TO JEST EPICKIE. Zmarnowane godziny, zabawa z bezpośrednim oknem, zastanawianie się, dlaczego „Foo” == „Foo” było fałszywe. Pan zasługuje na pochwałę. DZIĘKUJĘ CI!
Thiago Silva
18

Literał ciągu zawierający odcisk palca ma na początku znak od lewej do prawej . Gdy MMC wyświetla właściwości certyfikatu, poprzedza wartość odcisku palca tym znakiem, dzięki czemu bajty szesnastkowe są wyświetlane od lewej do prawej, nawet w ustawieniach regionalnych, w których tekst jest zwykle renderowany od prawej do lewej.

Prawdopodobnie był to skrót, który ktoś wybrał, ponieważ łatwiej było dołączyć znak przed jedną z wartości na liście właściwości niż napisać fragment kodu dynamicznie aktualizujący styl kontrolki edycji. Być może była to szybka poprawka do zgłoszenia błędu podczas testowania lokalizacji.

W MMC znacznik od lewej do prawej ma niezerową szerokość, co można zaobserwować, obserwując przesuwanie się kursora po strzale w poprzek i zauważając, że pierwszy rząd bajtów szesnastkowych jest przesunięty nieznacznie w prawo w porównaniu z drugi rząd.

W innych edytorach, takich jak Visual Studio, znacznik od lewej do prawej nie ma szerokości, ale nadal można go obserwować, zauważając, że kursor nie porusza się, gdy strzałka w poprzek jest. Jak odpowiedział KenD, usunięcie tej postaci rozwiązuje problem.

Szybki sposób na zidentyfikowanie niewidzialnego znaku: Użyj klawiatury, aby wybrać niewidoczny znak; następnie wklej go do programu Word między normalnymi znakami. Wybierz go w programie Word; następnie kliknij Wstaw> Symbol> Więcej symboli. Poszukaj w lewym dolnym rogu pod „Nazwa Unicode”.

Edward Brey
źródło
10

aby upewnić się, że te znaki „\ u200e” i RTL „\ u200f” zostały usunięte z ciągu odcisku palca, wykonaj następujące czynności

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

ostatnia zamiana ciągu na usunięcie białych znaków nie jest całkowicie konieczna, ponieważ znajduje mój certyfikat z nimi lub bez nich.

inne kłopotliwe postacie Unicode można znaleźć tutaj

Tablica kodowania UTF-8 i znaki Unicode

drowhunter
źródło
5

Moje dwa centy: skopiowałem wartość w MMC i wkleiłem ją w VS z włączonymi White Spaces.

Na początku nie było nic poza spacją na końcu: „1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57”

Teraz w pliku web.config wkleiłem wartość zachowując wszystkie spacje wewnątrz, usuwając ostatnią spację: „1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57”

To działa dobrze.

Jeśli użyję „1e52730d0029e6857be623e2fac7a508ac365e57”, usunięcie przestrzeni wewnątrz, jak widzę w innych postach, nie działa ...

Mam nadzieję, że to pomoże;)

wulkanik
źródło
2

Uruchamiam ten skrypt PowerShell, aby uzyskać wszystkie odciski palców i przekierować dane wyjściowe do pliku tekstowego i skopiować stamtąd odcisk palca.

Get-ChildItem -path cert:\LocalMachine\My

Aby przekierować do wyjścia do pliku tekstowego, użyj tego:

Get-ChildItem -path cert:\LocalMachine\My > thumbprints.txt
Pradeep
źródło
Dziękuję Ci za to! Miałem już certyfikat i po prostu go nie wiedziałem. To ujawniło to, co chciałem wiedzieć.
rjacobsen0
2

Wykonałem następujące czynności, aby usunąć dodatkowy znak, a także usunąć wszystko, co nie jest poprawne szesnastkowo (i ToUpper it):

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

To pozwoliło mi skopiować odcisk palca bezpośrednio z okna dialogowego menedżera certyfikatów i wkleić go bezpośrednio do mojego użycia.

Darren Sandford
źródło
0

Udało mi się rozwiązać problem, pisząc aplikację konsolową, która pobiera wszystkie certyfikaty z certyfikatu i wyświetla identyfikator odcisku palca. Skopiowałem wyjście konsoli i dokładnie włożyłem odcisk palca. Nie ma problemów. Wydaje się, że kopiowanie z konsoli MMC powoduje problemy, mimo że dane wyglądają podobnie. Użyłem tej strony jako punktu wyjścia do czytania wszystkich certyfikatów.

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

David Valdez
źródło