97 votes

Comment trouver un certificat par son empreinte digitale en C#

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

S'il vous plaît, dites-moi ce que je fais de mal.

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

225voto

KenD Points 1436

Je suis tombé sur cette question en cherchant le même problème sur Google, et j'ai trouvé la réponse. aquí : si, comme moi, vous avez obtenu votre empreinte "source" à partir de MMC en mettant en surbrillance l'empreinte et en la copiant dans le presse-papiers, vous avez presque certainement attrapé un caractère invisible au début de l'écran, donc :

string certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1" ;

est en fait

string certThumbPrint = " PERSONNAGE INVISIBLE fe14593dd66b2406c5269d742d04b6e1ab03adb1";

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

19voto

Edward Brey Points 8771

La chaîne de caractères contenant votre empreinte digitale a un caractère marque de gauche à droite au début. Lorsque MMC répertorie les propriétés du certificat, il fait précéder la valeur de l'empreinte de ce caractère afin que les octets hexadécimaux soient répertoriés de gauche à droite, même dans les régions où le texte est normalement rendu de droite à gauche.

Il s'agit probablement d'un raccourci que quelqu'un a pris parce qu'il était plus facile de faire précéder d'un caractère l'une des valeurs de la liste de propriétés que d'écrire un bout de code pour mettre à jour dynamiquement le style du contrôle d'édition. Il s'agissait peut-être d'une correction rapide d'un rapport de bogue pendant les tests de localisation.

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

Dans d'autres éditeurs tels que Visual Studio, la marque de gauche à droite n'a pas de largeur, mais vous pouvez tout de même l'observer en remarquant que le curseur ne se déplace pas lorsque vous le parcourez d'une flèche. Comme l'a répondu KenD, la suppression de ce caractère résout le problème.

Un moyen rapide d'identifier le personnage invisible : Utilisez le clavier pour sélectionner le caractère invisible, puis collez-le dans Word entre des caractères normaux. Sélectionnez-le dans Word, puis cliquez sur Insertion > Symbole > Autres symboles. Regardez en bas à gauche sous "Nom Unicode".

10voto

drowhunter Points 312

Pour s'assurer que ces LTR " \u200e "et RTL " \u200f Les caractères " " sont supprimés de votre chaîne d'empreintes digitales. faites ce qui 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 d'encodage UTF-8 et caractères Unicode

5voto

vulcanik Points 18

Mes deux centimes : J'ai copié la valeur dans MMC et je 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 maintenant tous les espaces à l'intérieur, en enlevant 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", en enlevant l'espace à l'intérieur comme je le vois dans d'autres posts, cela ne fonctionne pas...

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

3voto

Pradeep Points 115

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

Get-ChildItem -path cert:\LocalMachine\My

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X