Reconocer claramente un certificado en el almacén de certificados de Windows

Estoy desarrollando una biblioteca que genera datos XML y firma el XML generado. Instalé un certificado pkcs12 (generado con OpenSSL desde un archivo pem) en el almacén de certificados de Windows.

Estoy cargando el certificado del código C# con

X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = null;

foreach (var item in store.Certificates)
{
    if (item.SubjectName.Name.Contains("CN=IDENTIFIER"))
    {
        cert = item;
        break;
    }
}
store.Close();

En mi caso el identificador CN es: mi prenombre + apellido. El certificado proviene de un tercero. Así que creo que no tengo influencia en los identificadores.

Y aquí viene la pregunta:

¿Hay alguna forma de identificar exactamente este certificado de C#. En el futuro, podría ser posible que varios certificados tengan los mismos parámetros X509 (CN, etc., etc.).

Gracias de antemano.

preguntado el 03 de mayo de 12 a las 10:05

2 Respuestas

Sí, es posible que CN contenga el mismo identificador (por ejemplo, cuando el certificado se emite para una entidad comercial).

Los certificados generalmente se distinguen por una de las siguientes combinaciones: 1) Nombre del emisor (no CN, sino RDN, registro de nombre completo con múltiples campos) + número de serie del certificado (es único dentro de una CA) 2) Nombre del emisor + hash del certificado

Si no conoce el nombre del emisor antes de buscar el certificado, puede presentar la lista de certificados encontrados al usuario y, una vez que seleccione uno de los certificados, almacenar el hash del certificado para referencia futura.

En sistemas más pequeños (la computadora del usuario final), la cantidad de certificados en MI almacén suele ser pequeña y la probabilidad de colisión de hash es mínima. En sistemas grandes, la probabilidad es mayor y por eso también se utiliza el nombre del emisor.

contestado el 03 de mayo de 12 a las 10:05

Gracias, IssuerName + número de serie del certificado es exactamente lo que estaba buscando. IETF dice: El número de serie DEBE ser un número entero positivo asignado por la CA a cada certificado. DEBE ser único para cada certificado emitido por una CA determinada (es decir, el nombre del emisor y el número de serie identifican un certificado único). Las CA DEBEN obligar a que el número de serie sea un número entero no negativo. Pero, ¿qué quieres decir con RDN? - csteinmueller

Creo que el RDN es el nombre del emisor que es del tipo X500DistinguishedName - csteinmueller

@csteinmueller RDN significa RelativeDistinguishedName. Este es el tipo -- estructura con múltiples campos. NOTA: El número de serie es un número entero, pero la longitud de este número entero no está definida y los números de serie de 20 bytes de longitud no son raros. - Devolución de llamada de Eugene Mayevski

No olvides la huella digital. Puede ser la forma más fácil de identificar un certificado. - Presidente James K. Polk

Las posibilidades de colisiones en el resumen SHA-1 de un certificado completo deberían ser bastante similares a las de colisiones en el resumen de la parte tbsCertificate. Si eso sucediera (en tbsCertificate), eso significaría que un certificado podría modificarse y mantener la misma firma. Eso sería un gran problema y, con suerte, es poco probable, ciertamente menos probable que dos certificados con los mismos DN. - Marrón

Ampliando la respuesta de Eugene ...

La Certificates propiedad de X509Store es un X509CertificateCollection.

Probablemente te interese su Find método y el X509FindType. Ofrece varias formas de buscar un certificado. Estrictamente hablando, ambos el DN del sujeto y los nombres alternativos del sujeto debe ser importante para identificar la entidad asociada con un certificado. Sin embargo, pocas herramientas hacen esto desde el punto de vista de la presentación (por ejemplo, esto podría desordenarse bastante en una tabla).

Como señalaron GregS y Eugene, el huella digital del certificado (también conocida como huella digital/hash en otras herramientas) identificará un certificado específico de forma única, independientemente de su emisor. Eso se puede utilizar con X509FindType.

Las huellas dactilares se utilizan en varios lugares del mundo Windows/.Net/SSL. En particular, es la forma de elegir un certificado determinado para instalarlo en un puerto HTTPS.

Respondido 07 Oct 21, 06:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.