Tengo un problema cuando uso el método. 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();
}
}
En este caso, el método Find devuelve 0 resultados ( results.Count == 0
), pero si pongo findValue como constante, el método encuentra el certificado.
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();
}
}
fuente
Tomé algunas de las respuestas aquí y las combiné en un método estático que se encarga de eliminar todos los caracteres especiales y mayúsculas. Ojalá alguien más pueda usarlo.
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(); } }
fuente
Tuve el mismo problema y lo resolví:
Copié la huella digital de mmc directamente a VS. Comparé las cuerdas y no encontré ninguna diferencia.
Al verificar la longitud con hash.length, hubo una diferencia, 41 frente a 40.
Se agrega un Char invisible a la cadena al copiarlo de mmc.
Resolviendo:
Esta funcionando.
fuente
Esto también me hizo tropezar, escribí esta función para limpiar la huella digital cuando se copiaba y pegaba desde 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];
fuente
Fui víctima de esto. No solo había un carácter Unicode "de izquierda a derecha" en la pantalla de complemento de la consola de Windows de la huella digital, sino que también tenía caracteres hexadecimales en minúsculas, con espacios entre cada dos caracteres. La salida de CertUtil también tenía caracteres en minúscula y espacios. Para obtener una coincidencia, tuve que especificar findValue como una cadena que se ha transformado a
fuente
Este código debería funcionar.
Supongo que ha copiado esta huella digital de la consola de administración de certificados. Y ese valor copiado contiene un símbolo unicode no legible que es invisible en Visual Studio. Intente eliminar el primer símbolo invisible y si esto es lo que pienso, debería funcionar.
fuente
Me encontré con lo mismo. No pude encontrar esta respuesta en ningún lugar aquí, así que la publicaré. Me parece que la función de búsqueda de X509Store simplemente no funcionaba. Verifiqué esto con un simple bucle for y recuperando el certificado manualmente.
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]; } }
fuente
Reemplace el código para encontrar su certificado en la tienda de la siguiente manera:
var results = store.Certificates.Find(findType, findValue, true);
También el tercer parámetro que es bool devuelve certificados solo si el certificado es válido. Así que asegúrese de que su certificado sea válido. Si tiene un certificado autofirmado o algo así, simplemente pase el tercer parámetro para que sea "falso"
fuente
Aquí está la versión simple del código para las sugerencias anteriores, por supuesto que me funcionó
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; }
fuente
También encuentro este carácter invisible Unicode. Intentar usar el Bloc de notas (Windows 10) de alguna manera tampoco funcionó bien para mí. Finalmente, uso PowerShell para obtener la huella digital hexadecimal limpia:
PS C:\> $tp= (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match "mycert"}).Thumbprint; PS C:\> $tp
Demasiado para char Unicode.
fuente
var results = store.Certificates.Find(findType, findType, true);
Creo que quiere decir que el segundo parámetro sea "findValue".
fuente
Solo para que sepas cuál es el personaje invisible, veo que la huella digital en el mmc es: 75 3a ...
Luego lo copio y lo pego en mi vim, veo lo siguiente:
<200e> 75 3a ...
Entonces, después de deshacerse del primer carácter "<200e>" y los espacios adicionales, estará bien.
fuente
+1 para la respuesta de Aasmund Eldhuset (y otras respuestas).
Puede ser difícil verificar que esté presente. Por ejemplo, copiar la huella digital de mi archivo de configuración al editor binario VS a veces obtiene el carácter invisible y otras veces no.
Además, este código no mostró un problema. Revisé el código y pasé el mouse sobre x509Store para encontrar el certificado que quería.
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);
fuente
Después de un largo análisis, esto es lo que funcionó para mí.
Esto funciona a las mil maravillas.
fuente