web-dev-qa-db-fra.com

Comment trouver un certificat par son empreinte numérique en C #

J'utilise ce code pour trouver le certificat par son empreinte numérique. Le certificat existe dans le gestionnaire de certificats du magasin de certificats personnel, mais ce code ne trouve pas ce certificat.

Veuillez me dire où je me trompe.

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

Je suis juste tombé sur cette question lors de la recherche sur Google pour le même problème, et j'ai trouvé la réponse ici : si, comme moi, vous avez obtenu votre empreinte numérique "source" de MMC en mettant en surbrillance l'empreinte du pouce et en la copiant dans le presse-papiers, vous avez presque certainement attrapé un personnage invisible au début de l'écran, donc:

chaîne certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

est en fait

string certThumbPrint = " [~ # ~] caractère invisible [~ # ~] fe14593dd66b2406c5269d742d04b6e1ab03adb1";

Si vous supprimez ce caractère invisible (vous pouvez dire qu'il est là lorsque vous appuyez sur la touche de retour arrière ou supprimez à côté et rien ne semble se produire), ou si vous retapez simplement l'empreinte numérique à la main, votre code devrait fonctionner correctement. Maintenant, si seulement Visual Studio avait une option "afficher les caractères invisibles" ...

198
KenD

Le littéral de chaîne contenant votre empreinte numérique a un marque de gauche à droite au début. Lorsque MMC répertorie les propriétés du certificat, il précède la valeur d'empreinte numérique avec ce caractère afin que les octets hexadécimaux soient répertoriés de gauche à droite même dans les environnements locaux où le texte est normalement rendu de droite à gauche.

Il s'agit probablement d'un raccourci que quelqu'un a pris car il était plus facile d'ajouter un caractère à l'une des valeurs de la liste des propriétés que d'écrire un peu de code pour mettre à jour dynamiquement le style du contrôle d'édition. C'était peut-être une solution rapide à un rapport de bogue lors des tests de localisation.

Dans la console MMC, la marque de gauche à droite a une largeur non nulle, que vous pouvez observer en regardant le curseur se déplacer lorsque vous la traversez et en notant que la première ligne d'octets hexadécimaux est légèrement décalée vers la droite par rapport à la deuxième rang.

Dans d'autres éditeurs tels que Visual Studio, la marque de gauche à droite n'a pas de largeur, mais vous pouvez toujours l'observer en remarquant que le curseur ne bouge pas lorsque vous la traversez. Comme KenD a répondu, la suppression de ce caractère résout le problème.

Moyen rapide d'identifier le caractère invisible: Utilisez le clavier pour sélectionner le caractère invisible; puis collez-le dans Word entre certains caractères normaux. Sélectionnez-le dans Word; puis cliquez sur Insérer> Symbole> Plus de symboles. Regardez en bas à gauche sous "Nom Unicode".

17
Edward Brey

pour vous assurer que ces caractères LTR "\ u200e" et RTL "\ u200f" sont supprimés de votre chaîne d'empreinte numérique, procédez comme suit

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

le dernier remplacement de chaîne pour la suppression des espaces blancs n'est pas complètement nécessaire car il trouve mon certificat avec ou sans eux.

d'autres caractères Unicode gênants peuvent être trouvés ici

Table de codage UTF-8 et caractères Unicode

10
drowhunter

Mes deux cents: j'ai copié la valeur dans MMC et l'ai collée dans VS avec les espaces blancs activés.

Il n'y avait rien au début mais un espace à la fin: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Maintenant, dans le fichier web.config, j'ai collé la valeur en conservant tous les espaces à l'intérieur, en supprimant l'espace final: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Cela fonctionne bien.

Si j'utilise "1e52730d0029e6857be623e2fac7a508ac365e57", supprimer l'espace à l'intérieur comme je le vois dans d'autres articles, ne fonctionne pas ...

J'espère que cela peut vous aider;)

5
vulcanik

J'ai fait ce qui suit pour supprimer le caractère supplémentaire et également pour supprimer tout autre élément qui n'est pas hexadécimal valide (et ToUpper it):

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

Cela m'a permis de copier l'empreinte numérique directement à partir de la boîte de dialogue du gestionnaire de certificats et de la coller directement dans mon utilisation.

2
Darren Sandford

J'ai pu résoudre le problème en écrivant une application console qui récupère tous les certificats sur le certificat et génère l'ID d'empreinte numérique. J'ai copié la sortie de la console et inséré exactement l'empreinte numérique. Pas d'issues. Il semble que la copie à partir de la console MMC cause des problèmes même si les données semblent similaires. J'ai utilisé ce site comme point de départ pour lire tous les certificats.

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

0
David Valdez

J'exécute ce script PowerShell pour obtenir toutes les empreintes digitales et rediriger la sortie vers un fichier texte et copier l'empreinte numérique à partir de là.

Get-ChildItem -path cert:\LocalMachine\My

Pour rediriger vers la sortie vers un fichier texte, utilisez ceci:

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