clientcredentialtype clientcredentials clientcertificate c# wcf certificate ssl-certificate x509certificate

c# - clientcredentials - Problemas con X509Store Certificates.Find FindByThprint



wcf message security certificate (12)

Aquí está la versión simple de código para las sugerencias anteriores, por supuesto, que se trabajó para mí

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

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


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 no legible unicode que es invisible en Visual Studio. Intente eliminar el primer símbolo invisible y, si esto es lo que pienso, debería funcionar.


Esto me hizo tropezar también. Escribí esta función para limpiar la huella digital cuando la copié y pegué 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];


Fui víctima de esto. No solo había un carácter Unicode "de izquierda a derecha" en la pantalla del complemento de la consola de Windows de la huella digital, sino que también tenía caracteres hexadecimales en minúscula, con espacios entre cada dos caracteres. La salida de CertUtil también tenía caracteres en minúsculas y espacios. Para obtener una coincidencia, tuve que especificar findValue como una cadena que se ha transformado en

  1. Eliminar el personaje especial principal,
  2. Eliminar el espacio en blanco entre los grupos de caracteres,
  3. Cambie todos los caracteres a mayúsculas .

Me encontré con esta misma cosa. No pude encontrar esta respuesta en ningún lugar aquí, así que la publicaré. Me parece que la función de búsqueda X509Store simplemente no funcionaba. Lo verifiqué con un simple bucle 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]; } }


Me encuentro con este char Unicode invisible también. Tratar de usar el Bloc de notas (Windows 10) de alguna manera tampoco funcionó bien para mí. Finalmente, uso PowerShell para obtener el hexágono de huella digital limpio:

PS C:/> $tp= (Get-ChildItem -Path Cert:/LocalMachine/My | Where-Object {$_.Subject -match "mycert"}).Thumbprint; PS C:/> $tp

TANTO para char Unicode.


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 3er parámetro que es bool devuelve certificados solo si el certificado es válido. Por lo tanto, asegúrese de que su certificado sea válido. Si tiene un certificado autofirmado más o menos, simplemente pase el tercer param para que sea "falso"


Solo para dejarles saber cuál es el personaje invisible, veo la huella digital en el mmc siendo: 75 3a ...

Luego lo copio y lo pego en mi vim, veo lo siguiente:

<200e> 75 3a ...

Entonces, después de deshacerse del primer char "<200e>" y los espacios adicionales, estarás bien.


Supongo que ha copiado y pegado la huella digital del cuadro de diálogo de información del certificado de Windows en su código (o en un archivo de configuración si este es un ejemplo simplificado). Curiosamente, el primer personaje en el cuadro de texto de huella digital es el carácter de control invisible "marca de izquierda a derecha" de Unicode . Intente seleccionar la cita de la secuencia de apertura y el primer carácter de la huella digital, eliminándolos (lo que también eliminará el carácter invisible) y reescribiéndolos a mano.

Estuve sujeto a este extraño comportamiento hoy, y me tomó más de una hora resolverlo. La forma en que finalmente lo vi fue mediante el uso del depurador para verificar las longitudes y los códigos hash de findValue y de la Thumbprint findValue del objeto de certificado.


Tomé algunas de las respuestas aquí y las combiné en un método estático que se encarga de eliminar todo tipo de caracteres especiales y mayúsculas. Con suerte, alguien más puede 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(); } }


Tuve el mismo problema y lo resolví:

  1. Copié la huella dactilar de mmc directamente a VS. Comparé las cuerdas y no encontré ninguna diferencia.

  2. Comprobando la longitud con hash.length, hubo una diferencia, 41 vs. 40.

Hay un Char invisible añadido a la cadena al copiarlo de mmc.

Resolviendo:

  1. Copie la huella dactilar de mmc a Notepad.exe
  2. copia esta cadena nuevamente
  3. pegar a tu código

Esta funcionando.


var results = store.Certificates.Find(findType, findType, true);

Creo que te refieres al 2 ° param como "findValue".