wake-up-neo.com

Probleme mit X509Store-Zertifikaten. FindByThumbprint finden

Ich habe ein Problem, wenn ich die Methode X509Store.Certificates.Find verwende.

public static X509Certificate2 FromStore(StoreName storeName, 
          StoreLocation storeLocation, X509FindType findType, string findValue)
{
    X509Store store = new X509Store(storeName, storeLocation);
    store.Open(OpenFlags.ReadOnly);
    try
    {
        //findValue = "7a6fa503ab57b81d6318a51ca265e739a51ce660"
        var results = store.Certificates.Find(findType, findValue, true);

        return results[0];                
    }
    finally
    {
        store.Close();
    }
}

In diesem Fall gibt die Find-Methode 0 Ergebnisse zurück (results.Count == 0), aber wenn ich findValue als konstant setze, finde die Methode das Zertifikat.

public static X509Certificate2 FromStore(StoreName storeName, 
           StoreLocation storeLocation, X509FindType findType, string findValue)
{
    X509Store store = new X509Store(storeName, storeLocation);
    store.Open(OpenFlags.ReadOnly);
    try
    {         
        //findValue= "7a6fa503ab57b81d6318a51ca265e739a51ce660"
        var results = store.Certificates.Find(findType, 
                              "7a6fa503ab57b81d6318a51ca265e739a51ce660", true);
        return results[0];
    }
    finally
    {
        store.Close();
    }
}
70
nunofamel

Ich nehme an, Sie haben den Fingerabdruck aus dem Windows-Dialogfeld mit den Zertifikatinformationen in Ihren Code kopiert (oder in eine Konfigurationsdatei, wenn dies ein vereinfachtes Beispiel ist). Das erste Zeichen im Fingerabdruck-Textfeld ist das Steuerzeichen invisible Unicode "Links-Rechts-Markierung" . Versuchen Sie, den Anfangsstring-Anführungsstrich und das erste Zeichen des Fingerabdrucks auszuwählen, zu löschen (wodurch auch das unsichtbare Zeichen entfernt wird), und geben Sie sie erneut von Hand ein.

Ich war heute selbst diesem merkwürdigen Verhalten ausgesetzt, und ich habe über eine Stunde gebraucht, um es herauszufinden. Wie ich es schließlich sah, war der Debugger, um die Längen- und Hashcodes von findValue und der Thumbprint des Zertifikatsobjekts zu überprüfen.

118

Ich habe hier einige Antworten aufgenommen und sie zu einer statischen Methode zusammengefasst, bei der alle Sonderzeichen und Großbuchstaben entfernt werden. Hoffentlich kann jemand anderes es benutzen.

    public static X509Certificate2 GetCertificate(string thumbprint)
    {
        // strip any non-hexadecimal values and make uppercase
        thumbprint = Regex.Replace(thumbprint, @"[^\da-fA-F]", string.Empty).ToUpper();
        var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);

        try
        {
            store.Open(OpenFlags.ReadOnly);

            var certCollection = store.Certificates;
            var signingCert = certCollection.Find(X509FindType.FindByThumbprint, thumbprint, false);
            if (signingCert.Count == 0)
            {
                throw new FileNotFoundException(string.Format("Cert with thumbprint: '{0}' not found in local machine cert store.", thumbprint));
            }

            return signingCert[0];
        }
        finally
        {
            store.Close();
        }
    }
42
jhilden

Ich hatte das gleiche Problem und habe es gelöst:

  1. Ich habe den Fingerprint von mmc direkt nach VS kopiert. Ich habe die Saiten verglichen und keinen Unterschied festgestellt.

  2. Bei der Überprüfung der Länge mit Hash-Länge gab es einen Unterschied, 41 vs. 40.

Dem String wird ein unsichtbares Zeichen hinzugefügt, indem er aus mmc kopiert wird.


Lösen:

  1. kopieren Sie den Fingerprint von mmc nach Notepad.exe
  2. kopiere diese Zeichenfolge erneut
  3. in den Code einfügen

Es funktioniert.

22
Thomas

Das hat mich auch gestört, ich habe diese Funktion geschrieben, um den Fingerabdruck beim Kopieren und Einfügen aus der MMC zu entfernen:

public string CleanThumbprint(string mmcThumbprint)
    {
        //replace spaces, non Word chars and convert to uppercase
        return Regex.Replace(mmcThumbprint, @"\s|\W", "").ToUpper();
    }

...
        var myThumbprint = CleanThumbprint("‎b3 ab 84 e5 1e e5 e4 75 e7 a5 3e 27 8c 87 9d 2f 05 02 27 56");
        var myCertificate = certificates.Find(X509FindType.FindByThumbprint, myThumbprint, true)[0];
8
Rob C

Ich bin dem zum Opfer gefallen. In der Snap-In-Anzeige des Daumenabdrucks der Windows-Konsole gab es nicht nur ein Unicode-Zeichen "von links nach rechts", sondern es enthielt auch Kleinbuchstaben mit Leerzeichen zwischen zwei Zeichen. Die Ausgabe von CertUtil hatte auch Kleinbuchstaben und Leerzeichen. Um eine Übereinstimmung zu erhalten, musste ich findValue als eine Zeichenfolge angeben, die in umgewandelt wurde 

  1. Entfernen Sie das führende Sonderzeichen.
  2. Entfernen Sie den Leerraum zwischen den Zeichengruppen.
  3. Ändern Sie alle Zeichen in Großbuchstaben .
8
Greg

Dieser Code sollte funktionieren.

Ich nehme an, Sie haben diesen Fingerabdruck von der Zertifikatverwaltungskonsole kopiert ... und dieser kopierte Wert enthält ein nicht lesbares Unicode-Symbol, das in Visual Studio nicht sichtbar ist. Versuchen Sie, das erste unsichtbare Symbol zu löschen, und wenn mir dies einfällt, sollte dies funktionieren.

2
Dmitry Dyachkov

Ich bin auf dasselbe gestoßen. Ich konnte diese Antwort nirgends hier finden, also werde ich sie posten. Es scheint für mich, dass die X509Store-Funktion einfach nicht funktioniert. Ich habe dies durch eine einfache for-Schleife überprüft und das cert manuell abgerufen. 

  X509Store store = new X509Store(StoreName.Root,StoreLocation.LocalMachine);
        store.Open(OpenFlags.ReadOnly);
        X509Certificate cert = new X509Certificate();
        for (int i = 0; i < store.Certificates.Count; i++)
        {
            if (store.Certificates[i].SerialNumber == "XXXX")
            {
                cert = store.Certificates[i];
            }
        }
1
vikingben

Ersetzen Sie den Code, um Ihr Zertifikat im Geschäft wie folgt zu finden:

var results = store.Certificates.Find(findType, findValue, true); 

Auch der dritte Parameter, der bool ist, gibt Zertifikate nur dann zurück, wenn das Zertifikat gültig ist. Stellen Sie daher sicher, dass Ihr Zertifikat gültig ist. Wenn Sie ein selbstsigniertes Zertifikat haben, übergeben Sie den dritten Parameter als "false".

1
Rajesh

Um Sie wissen zu lassen, was das unsichtbare Zeichen ist, sehe ich den Fingerabdruck in der mmc: 75 3a ...

Dann kopiere und füge ich es in meine vim ein, ich sehe folgendes:

<200e> 75 3a ...

Nachdem Sie also das erste Zeichen "<200e>" und die zusätzlichen Leerzeichen entfernt haben, ist alles in Ordnung.

0
iefgnoix

Ich stoße auch auf dieses unsichtbare Unicode-Zeichen. Der Versuch, Notepad (Windows 10) zu verwenden, funktionierte für mich auch nicht gut. Schließlich verwende ich PowerShell, um den sauberen Fingerabdruck-Hex zu erhalten:

PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint;
PS C:\> $tp

So viel für Unicode-Zeichen.

0
Riza Marhaban

Hier ist die einfache Version des Codes für die obigen Vorschläge, die für mich erarbeitet wurden

 private X509Certificate2 GetCertificate()
    {
        var certStore = new X509Store("my");
        certStore.Open(OpenFlags.ReadOnly);
        try
        {
            const string thumbprint = "18 33 fe 3a 67 d1 9e 0d f6 1e e5 d5 58 aa 8a 97 8c c4 d8 c3";
            var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint,
            Regex.Replace(thumbprint, @"\s+", "").ToUpper(), false);
            if (certCollection.Count > 0)
                return certCollection[0];
        }
        finally
        {
            certStore.Close();
        }
        return null;
    }
0
Jay
var results = store.Certificates.Find(findType, findType, true);

Ich denke, Sie meinen den zweiten Parameter als "findValue". 

0
Joe