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();
}
}
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.
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();
}
}
j'ai eu le même problème et je l'ai résolu:
-
j'ai copié l'Empreinte Digitale de mmc directement à VS. J'ai comparé les cordes et je n'ai pas trouvé de différence.
-
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:
- copiez L'Empreinte Digitale de mmc à Notepad.exe
- copier cette chaîne de nouveau
- coller à votre code
ça marche.
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
- supprimer le caractère spécial principal,
- Supprimer l'espace entre les groupes de caractères,
- changer tous les caractères en majuscule .
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];
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.
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];
}
}
var results = store.Certificates.Find(findType, findType, true);
vous voulez dire"findValue".
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"
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;
}
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.
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.