2009-02-04 10 views
7

Estoy trabajando con la clase de certificado X509 de la biblioteca OpenSSL, y necesito consultar la extensión de "uso de clave".Consultando extensiones en certificados X509 usando OpenSSL

Después de abandonar vapourware "documentación" de OpenSSL, algunos tiros en la oscuridad buscando la Web finalmente reveló que tenía que llamar

X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx) 

y buscar a través de la cabecera objects.h reveló la NID adecuada.

El problema es que esta llamada devuelve un puntero a void, que aparentemente puede apuntar a una variedad de estructuras, dependiendo de la extensión que haya solicitado.

Dado que ninguno de estos parece estar documentado, uno queda sin una forma de averiguar cómo analizar qué devuelve la función.

¿Alguien me puede señalar un documento que realmente habla de esto, en lugar de solo enumerar cosas que puedo descubrir por mí mismo (el perfil de función, de qué archivo proviene, etc.)?

+1

No tengo respuesta, pero voy a segundo sentimiento sobre la calidad de la documentación para OpenSSL ... Ahora también estoy trabajando con eso (recién empezando), y es horrible tratar de encontrar ejemplos o documentos para algo más que simples operaciones ... Siento tu dolor. – Nick

+1

La única forma en que descubrí cómo usar la API fue tomar la herramienta de línea de comandos (fuente), modificar el código (comentar los parámetros de la línea de comandos que no necesitaba) y seguirlo. Desde allí, pude usar los "documentos" de la API para completar las lagunas. – Joe

Respuesta

5

Las soluciones más fáciles de leer el uso de la clave parece ser

X509* x509_cert = ... 
// without X509_check_ca x509_cert->ex_kusage always returns 0 (no idea why) 
int ca = X509_check_ca(x509_cert); 
unsigned long usage = x509_cert->ex_kusage; 

Los valores resultantes se definen en opensc/pkcs15-init.h

SC_PKCS15INIT_X509_DIGITAL_SIGNATURE  0x0080UL 
SC_PKCS15INIT_X509_NON_REPUDIATION  0x0040UL 
SC_PKCS15INIT_X509_KEY_ENCIPHERMENT  0x0020UL 
SC_PKCS15INIT_X509_DATA_ENCIPHERMENT  0x0010UL 
SC_PKCS15INIT_X509_KEY_AGREEMENT   0x0008UL 
SC_PKCS15INIT_X509_KEY_CERT_SIGN   0x0004UL 
SC_PKCS15INIT_X509_CRL_SIGN    0x0002UL 

llegué a que soultion encontrando el código siguiente de un archivo fuente openssl

/* Handle key usage */ 
if((usage=X509_get_ext_d2i(x, NID_key_usage, NULL, NULL))) { 
    if(usage->length > 0) { 
     x->ex_kusage = usage->data[0]; 
     if(usage->length > 1) 
     x->ex_kusage |= usage->data[1] << 8; 
    } else x->ex_kusage = 0; 
    x->ex_flags |= EXFLAG_KUSAGE; 
    ASN1_BIT_STRING_free(usage); 
} 
+0

My 'x509.h' contiene la advertencia:'/* Estos contienen copias de varios valores de extensión */'para muchos de los elementos de la estructura X509, incluido' ex_kusage'. Eso es probablemente por qué es cero hasta que llame a esa función. – chacham15

+0

tienes que verificar el valor de 'ex_flags' si tiene' EXFLAG_SET' que significa 'ex_kusage' y' ex_xkusage' están configurados y no necesitas llamar a 'X509_check_ca', puedes verificar' v3_purp.c' para más detalles – bikram990

Cuestiones relacionadas