J'ai un problème lorsque 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 de recherche renvoie 0 résultats ( results.Count == 0
), mais si je mets la valeur de recherche 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();
}
}
la source
J'ai pris certaines des réponses ici et les ai combinées dans une méthode statique qui prend soin de supprimer tout les caractères spéciaux et les majuscules. J'espère que quelqu'un d'autre pourra 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(); } }
la source
J'ai eu le même problème et je l'ai résolu:
J'ai copié l'empreinte digitale de mmc directement vers VS. J'ai comparé les cordes et je n'ai trouvé aucune différence.
En vérifiant la longueur avec hash.length, il y avait une différence, 41 contre 40.
Un caractère invisible est ajouté à la chaîne en le copiant hors de mmc.
Résolution:
Ça marche.
la source
Cela m'a fait trébucher aussi, j'ai écrit cette fonction pour nettoyer l'empreinte numérique lorsqu'elle est copiée et collée à 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];
la source
J'en ai été victime. Non seulement il y avait un caractère Unicode "de gauche à droite" dans l'affichage du composant logiciel enfichable de la console Windows de l'empreinte numérique, mais il avait également des caractères hexadécimaux minuscules, avec des espaces entre tous les deux caractères. La sortie de CertUtil contenait également 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
la source
Ce code devrait fonctionner.
Je suppose que vous avez copié cette empreinte numérique à partir de la console de gestion des certificats. Et cette valeur copiée contient un symbole non lisible Unicode qui est invisible dans Visual Studio. Essayez de supprimer le premier symbole invisible et si c'est ce à quoi je pense, cela devrait fonctionner.
la source
J'ai rencontré la même chose. Je n'ai trouvé cette réponse nulle part ici, alors je la posterai. Il me semble que la fonction de recherche X509Store ne fonctionnait tout simplement pas. J'ai vérifié cela par une simple boucle for et en récupérant le certificat 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]; } }
la source
Remplacez le code pour trouver votre certificat dans le magasin comme ci-dessous:
var results = store.Certificates.Find(findType, findValue, true);
Aussi le 3ème paramètre qui est bool ne renvoie les certificats que si le certificat est valide. Assurez-vous donc que votre certificat est valide. Si vous avez un certificat auto-signé ou plus, passez simplement le 3ème paramètre pour être "faux"
la source
Voici la version simple du code pour les suggestions ci-dessus - bien sûr, qui fonctionne 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; }
la source
Je rencontre également ce caractère Unicode invisible. Essayer d'utiliser Notepad (Windows 10) ne fonctionnait pas non plus pour moi. Enfin, j'utilise PowerShell pour obtenir l'hexagone propre de l'empreinte numérique:
PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint; PS C:\> $tp
TELLEMENT pour le caractère Unicode.
la source
var results = store.Certificates.Find(findType, findType, true);
Je pense que vous voulez dire que le 2ème paramètre est "findValue".
la source
Juste pour vous faire savoir ce qu'est le caractère invisible, je vois l'empreinte du pouce dans le mmc être: 75 3a ...
Ensuite, je le copie et le colle dans mon vim, je vois ce qui suit:
<200e> 75 3a ...
Donc, après vous être débarrassé du premier caractère "<200e>" et des espaces supplémentaires, tout ira bien.
la source
+1 pour la réponse d'Aasmund Eldhuset (et autres réponses).
Il peut être difficile de vérifier sa présence. Par exemple, la copie de l'empreinte numérique de mon fichier de configuration vers l'éditeur binaire VS obtient parfois le caractère invisible et parfois non.
De plus, ce code n'a pas montré de problème. J'ai parcouru le code et passé la souris sur le x509Store pour trouver le certificat que je voulais.
X509Certificate2 cert2 = null; string storeName = StoreName.My.ToString(); var x509Store = new X509Store(storeName, StoreLocation.LocalMachine); x509Store.Open(OpenFlags.ReadOnly); var cert3 = x509Store.Certificates[4]; var thumbprint3 = cert3.Thumbprint; int gotIt = thumbprint3.CompareTo(clientCert);
la source
Après une longue analyse, voici ce qui a fonctionné pour moi.
Cela fonctionne comme un charme.
la source