So finden Sie das Zertifikat anhand seines Fingerabdrucks in C #


80

Ich verwende diesen Code, um das Zertifikat anhand seines Fingerabdrucks zu finden. Das Zertifikat ist im Zertifikatmanager im persönlichen Zertifikatspeicher vorhanden, aber dieser Code findet dieses Zertifikat nicht.

Bitte sag mir, wo ich falsch mache.

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


X509Storeimplementiert, IDisposableso dass es mit einer usingAnweisung verwendet werden sollte.
Alex Vallejo

Antworten:


206

Ich bin gerade über diese Frage gestolpert, als ich nach demselben Problem gegoogelt habe, und habe hier die Antwort gefunden : Wenn Sie wie ich Ihren "Quell" -Fingerabdruck von MMC erhalten haben, indem Sie den Fingerabdruck hervorgehoben und in die Zwischenablage kopiert haben, haben Sie mit ziemlicher Sicherheit einen gefunden unsichtbares Zeichen am Anfang des Bildschirms, also:

string certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

ist eigentlich

String certThumbPrint = " INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1";

Wenn Sie dieses unsichtbare Zeichen löschen (Sie können feststellen, dass es vorhanden ist, wenn Sie die Rücktaste drücken oder daneben löschen und nichts zu passieren scheint) oder den Fingerabdruck einfach von Hand erneut eingeben, sollte Ihr Code einwandfrei funktionieren. Wenn nur Visual Studio die Option "Unsichtbare Zeichen anzeigen" hätte ...


2
VS verfügt über Bearbeiten> Erweitert> Leerraum anzeigen (Strg + R, Strg + W zum Umschalten) - es kann hilfreich sein, wenn Sie wissen, wonach Sie suchen müssen.
Michael Freidgeim

@ MichaelFreidgeim hilft es nicht. VS zeigt nicht die versteckten Zeichen, sondern nur Leerzeichen.
George Polevoy

Ich weiß, dass es ein alter Beitrag ist, aber ich habe es mit einem ähnlichen Problem zu tun. Hier ist die Sache. Der Code, der anhand des Fingerabdrucks gesucht werden soll, ist in Ordnung, solange das Zertifikat auf Ihrem lokalen Konto ist. Ich poste auf einer externen URL? Wie kann ich ihre Zertifikate durchsuchen? es wirft mich auf X509Store ab certStore = neuer X509Store (StoreName.My, StoreLocation.CurrentUser);
Gnade

@MichaelFreidgeim View White Space zeigt diese unsichtbaren Zeichen zumindest in VS 2013 nicht an.
Jeremy Cook

3
HEILIG @% $ @ $ !!! DAS IST EPISCH. Verschwendete Stunden, spielen mit dem unmittelbaren Fenster und fragen sich, warum "Foo" == "Foo" falsch war. Sie, Sir, verdienen eine Gegenstimme. DANKE!
Thiago Silva

17

Das Zeichenfolgenliteral mit Ihrem Fingerabdruck hat am Anfang eine Markierung von links nach rechts . Wenn MMC die Zertifikateigenschaften auflistet, wird dem Fingerabdruckwert dieses Zeichen vorangestellt, sodass die Hex-Bytes auch in Gebietsschemas, in denen der Text normalerweise von rechts nach links gerendert wird, von links nach rechts aufgelistet werden.

Wahrscheinlich war dies eine Verknüpfung, die jemand verwendet hat, weil es einfacher war, einem der Werte in der Eigenschaftsliste ein Zeichen voranzustellen, als ein bisschen Code zu schreiben, um den Stil des Bearbeitungssteuerelements dynamisch zu aktualisieren. Vielleicht war es eine schnelle Lösung für einen Fehlerbericht während der Lokalisierungstests.

In der MMC hat die Markierung von links nach rechts eine Breite ungleich Null. Sie können dies beobachten, indem Sie beobachten, wie sich der Cursor bewegt, wenn Sie darüber streichen, und ich bemerke, dass die erste Reihe von Hex-Bytes im Vergleich zu leicht nach rechts verschoben ist zweite Reihe.

In anderen Editoren wie Visual Studio hat die Markierung von links nach rechts keine Breite. Sie können sie jedoch beobachten, indem Sie feststellen, dass sich der Cursor beim Überfahren nicht bewegt. Wie KenD antwortete, löst das Löschen dieses Zeichens das Problem.

Schneller Weg, um das unsichtbare Zeichen zu identifizieren: Verwenden Sie die Tastatur, um das unsichtbare Zeichen auszuwählen. Fügen Sie es dann zwischen einigen normalen Zeichen in Word ein. Wählen Sie es in Word aus. Klicken Sie dann auf Einfügen> Symbol> Weitere Symbole. Schauen Sie unten links unter "Unicode-Name" nach.


10

Gehen Sie wie folgt vor, um sicherzustellen, dass die Zeichen LTR "\ u200e" und RTL "\ u200f" aus Ihrer Fingerabdruckzeichenfolge entfernt werden

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

Das letzte Ersetzen der Zeichenfolge für die Entfernung von Leerzeichen ist nicht vollständig erforderlich, da mein Zertifikat mit oder ohne diese gefunden wird.

Weitere störende Unicode-Zeichen finden Sie hier

UTF-8-Codierungstabelle und Unicode-Zeichen


5

Meine zwei Cent: Ich habe den Wert in MMC kopiert und in VS mit aktivierten Leerzeichen eingefügt.

Am Anfang war nichts als ein Leerzeichen am Ende: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Jetzt habe ich in die Datei web.config den Wert eingefügt, der alle darin enthaltenen Leerzeichen beibehält, und das letzte Leerzeichen entfernt: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Das funktioniert gut.

Wenn ich "1e52730d0029e6857be623e2fac7a508ac365e57" verwende, funktioniert es nicht, den Platz im Inneren zu entfernen, wie ich in anderen Posts sehe ...

Hoffe das kann helfen;)


2

Ich habe Folgendes getan, um das zusätzliche Zeichen zu entfernen und um alles andere zu entfernen, was nicht hexadezimal gültig ist (und um es zu verbessern):

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

Dadurch konnte ich den Fingerabdruck direkt aus dem Zertifikatmanager-Dialogfeld kopieren und direkt in meine Verwendung einfügen.


1

Ich führe dieses Powershell-Skript aus, um alle Fingerabdrücke abzurufen, die Ausgabe in eine Textdatei umzuleiten und den Fingerabdruck von dort zu kopieren.

Get-ChildItem -path cert:\LocalMachine\My

Verwenden Sie Folgendes, um zur Ausgabe in eine Textdatei umzuleiten:

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

0

Ich konnte das Problem beheben, indem ich eine Konsolenanwendung schrieb, die alle Zertifikate auf dem Zertifikat abruft und die Fingerabdruck-ID ausgibt. Ich habe die Konsolenausgabe kopiert und den Fingerabdruck genau eingefügt. Keine Probleme. Das Kopieren von der MMC-Konsole scheint Probleme zu verursachen, obwohl die Daten ähnlich aussehen. Ich habe diese Seite als Ausgangspunkt für das Lesen aller Zertifikate verwendet.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.