Problèmes avec les certificats X509Store.Trouver FindByThumbprint

j'ai un problème quand j'utilise la méthode X509Store.Certificates.Find

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

dans ce cas la méthode Find retourne 0 Résultats ( results.Count == 0 ), mais si je mets findValue comme constante la méthode trouve le certificat.

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();
    }
}
65
demandé sur Aasmund Eldhuset 2011-12-09 19:58:41

12 réponses

je suppose que vous avez copié l'empreinte du pouce de la boîte de dialogue Windows certificate information dans votre code (ou dans un fichier de configuration si c'est un exemple simplifié). Fait fâcheux, le premier caractère dans la boîte de texte de l'empreinte du pouce est le Unicode invisible "de gauche à droite-marque" caractère de contrôle . Essayez de sélectionner la chaîne d'ouverture citation et le premier caractère de l'empreinte du pouce, de les supprimer (qui permettra également de se débarrasser du caractère invisible), et de retaper à la main.

j'ai été soumis à ce comportement bizarre moi-même aujourd'hui, et il m'a fallu plus d'une heure pour le comprendre. Je l'ai finalement vu en utilisant le débogueur pour vérifier les longueurs et les codes de hachage de findValue et de Thumbprint de l'objet de certificat.

107
répondu Aasmund Eldhuset 2018-03-26 20:42:34

j'ai pris quelques réponses ici et les a combinés dans une méthode statique qui prend soin de supprimer les caractères spéciaux et majuscules tout. J'espère que quelqu'un d'autre peut l'utiliser.

    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();
        }
    }
39
répondu jhilden 2017-12-29 21:57:47

j'ai eu le même problème et je l'ai résolu:

  1. j'ai copié l'Empreinte Digitale de mmc directement à VS. J'ai comparé les cordes et je n'ai pas trouvé de différence.

  2. vérification de la longueur avec hachage.longueur, il y a une différence, 41 vs 40.

un caractère invisible est ajouté à la chaîne en la copiant à partir de mmc.


résoudre:

  1. copiez L'Empreinte Digitale de mmc à Notepad.exe
  2. copier cette chaîne de nouveau
  3. coller à votre code

ça marche.

21
répondu Thomas 2014-03-21 00:35:31

j'en suis victime. Non seulement il y avait un caractère Unicode "de gauche à droite" dans L'affichage snap-in de la console Windows de l'empreinte du pouce, mais il y avait aussi des caractères hex minuscules, avec des espaces entre les deux caractères. La sortie de CertUtil avait aussi des caractères minuscules et des espaces. Pour obtenir une correspondance, j'ai dû spécifier la findValue comme une chaîne qui a été transformée en

  1. supprimer le caractère spécial principal,
  2. Supprimer l'espace entre les groupes de caractères,
  3. changer tous les caractères en majuscule .
8
répondu Greg 2013-12-11 23:06:36

cela m'a fait trébucher aussi, j'ai écrit cette fonction pour nettoyer l'empreinte du pouce lorsque copié et collé à partir de MMC:

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
répondu Rob C 2016-05-24 16:35:30

ce code devrait fonctionner.

je suppose que vous avez copié cette empreinte depuis la console de gestion des certificats. Et cette valeur copiée contient le symbole unicode non lisible qui est invisible dans Visual Studio. Essayez de supprimer le premier symbole invisible et si c'est ce que je pense, cela devrait fonctionner.

1
répondu Dmitry Dyachkov 2012-11-02 16:25:28

j'ai rencontré la même chose. Je n'ai trouvé cette réponse nulle part ici donc je vais la poster. Il me semble que la fonction x509store find ne fonctionnait pas. J'ai vérifié par une simple boucle et j'ai récupéré le cert manuellement.

  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
répondu vikingben 2014-01-15 17:49:43
var results = store.Certificates.Find(findType, findType, true);

vous voulez dire"findValue".

0
répondu Joe 2011-12-09 16:04:30

remplacer le code pour trouver votre certificat dans le magasin comme suit:

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

aussi le 3ème param qui est bool certificats de retour seulement si le certificat est valide. Donc, assurez-vous que votre certificat est valide. Si vous avez un certificat auto-signé ou alors juste passer le 3ème paramètre à être "faux"

0
répondu Rajesh 2011-12-09 16:21:32

Voici la version simple du code pour les suggestions ci-dessus-bien sûr qui est travaillé pour moi

 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
répondu Jay 2016-02-19 01:19:53

je rencontre aussi ce char Unicode invisible. Essayer D'utiliser le Bloc-Notes (Windows 10) n'a pas fonctionné pour moi non plus. Enfin, J'utilise PowerShell pour obtenir l'hex d'empreinte de pouce propre:

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

autant pour Unicode char.

0
répondu Riza Marhaban 2017-06-19 09:42:17

juste pour vous faire savoir ce qu'est le caractère invisible, je vois l'empreinte du pouce dans le mmc étant: 75 3a ...

puis je le copie et le colle dans mon vim, je vois ce qui suit:

<200e>75 3a ...

donc après que vous vous êtes débarrassé du premier char "<200e>" et des espaces supplémentaires, vous serez très bien.

0
répondu iefgnoix 2017-09-13 21:04:51