Cómo encontrar el certificado por su huella digital en C #


82

Estoy usando este código para encontrar el certificado por su huella digital. El certificado existe en el administrador de certificados en el almacén de certificados personales, pero este código no encuentra ese certificado.

Por favor, dígame en qué me equivoco.

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


X509Storeimplementa, IDisposablepor lo que debe usarse con una usingdeclaración.
Alex Vallejo

Respuestas:


208

Me encontré con esta pregunta cuando buscaba en Google el mismo problema y encontré la respuesta aquí : si, como yo, obtuvo su huella digital "fuente" de MMC al resaltar la huella digital y copiarla en el portapapeles, es casi seguro que haya capturado una carácter invisible al inicio de la pantalla, entonces:

string certThumbPrint = "fe14593dd66b2406c5269d742d04b6e1ab03adb1";

es en realidad

certThumbPrint cadena = " INVISIBLECHARACTER fe14593dd66b2406c5269d742d04b6e1ab03adb1";

Si elimina este carácter invisible (puede saber que está allí cuando presiona la tecla de retroceso o eliminar junto a él y parece que no sucede nada), o simplemente vuelve a escribir la huella digital a mano, su código debería funcionar bien. Ahora, si solo Visual Studio tuviera una opción "mostrar caracteres invisibles" ...


2
VS tiene Editar> Avanzado> Ver espacio en blanco (Ctrl + R, Ctrl + W para alternar); puede ayudar, si sabe, qué buscar.
Michael Freidgeim

@MichaelFreidgeim no ayuda. VS no muestra los caracteres ocultos, solo caracteres espaciales.
George Polevoy

@MichaelFreidgeim View White Space no muestra estos caracteres invisibles particulares, al menos en VS 2013.
Jeremy Cook

También me enamoré de la selección y copia de la MMC.
Mötz

3
SANTO @% $ @ $ !!! ESTO ES ÉPICO. Wasted Hrs, jugando con la ventana inmediata, preguntándose por qué "Foo" == "Foo" era falso. Usted, señor, merece un voto a favor. ¡GRACIAS!
Thiago Silva

18

El literal de cadena que contiene su huella digital tiene una marca de izquierda a derecha al principio. Cuando MMC enumera las propiedades del certificado, precede el valor de la huella digital con este carácter para que los bytes hexadecimales se enumeren de izquierda a derecha incluso en las configuraciones regionales donde el texto normalmente se representa de derecha a izquierda.

Probablemente, este fue un atajo que alguien tomó porque era más fácil anteponer un carácter a uno de los valores en la lista de propiedades que escribir un poco de código para actualizar dinámicamente el estilo del control de edición. Quizás fue una solución rápida a un informe de error durante las pruebas de localización.

En el MMC, la marca de izquierda a derecha tiene un ancho distinto de cero, que puede observar al observar el movimiento del cursor cuando la flecha a través de él y al notar que la primera fila de bytes hexadecimales se desplaza ligeramente hacia la derecha en comparación con el segunda fila.

En otros editores como Visual Studio, la marca de izquierda a derecha no tiene ancho, pero aún puede observarla al notar que el cursor no se mueve cuando la flecha cruza es. Como respondió KenD, eliminar este carácter resuelve el problema.

Manera rápida de identificar el carácter invisible: Utilice el teclado para seleccionar el carácter invisible; luego péguelo en Word entre algunos caracteres normales. Selecciónelo en Word; luego haga clic en Insertar> Símbolo> Más símbolos. Busque en la parte inferior izquierda debajo de "Nombre Unicode".


10

para asegurarse de que esos caracteres LTR "\ u200e" y RTL "\ u200f" se eliminen de su cadena de huellas digitales, haga lo siguiente

thumbprint = thumbprint.Replace("\u200e", string.Empty).Replace("\u200f", string.Empty).Replace(" ",string.Empty);

el último reemplazo de cadena para la eliminación de espacios en blanco no es completamente necesario, ya que encuentra mi certificado con o sin ellos.

otros caracteres unicode problemáticos se pueden encontrar aquí

Tabla de codificación UTF-8 y caracteres Unicode


5

Mis dos centavos: copié el valor en MMC y lo pegué en VS con los espacios en blanco habilitados.

No había nada al principio, excepto un espacio al final: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Ahora, en el archivo web.config pegué el valor manteniendo todos los espacios adentro, quitando el espacio final: "1e 52 73 0d 00 29 e6 85 7b e6 23 e2 fa c7 a5 08 ac 36 5e 57"

Esto funciona bien.

Si uso "1e52730d0029e6857be623e2fac7a508ac365e57", eliminando el espacio interior como veo en otras publicaciones, no funciona ...

Espero que esto pueda ayudar;)


2

Ejecuto este script de PowerShell para obtener todas las huellas digitales y redirigir la salida a un archivo de texto y copiar la huella digital desde allí.

Get-ChildItem -path cert:\LocalMachine\My

Para redirigir a la salida a un archivo de texto, use esto:

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

¡Gracias por esto! Ya tenía un certificado y simplemente no lo sabía. Esto reveló lo que necesitaba saber.
rjacobsen0

2

Hice lo siguiente para eliminar el carácter adicional y también para eliminar cualquier otra cosa que no sea hexadecimal válida (y ToUpper it):

            thumbprint = Regex.Replace(thumbprint.ToUpper(), @"[^0-9A-F]+", string.Empty);

Esto me permitió copiar la huella digital directamente desde el cuadro de diálogo del administrador de certificados y pegarla directamente en mi uso.


0

Pude resolver el problema escribiendo una aplicación de consola que recupera todos los certificados en el certificado y genera la identificación de la huella digital. Copié la salida de la consola e inserté la huella digital exactamente. Sin problemas. Parece que copiar desde la consola MMC causa problemas aunque los datos sean similares. Usé este sitio como punto de partida para leer todos los certificados.

https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.thumbprint(v=vs.110).aspx

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.