2012-04-04 16 views
5

Estoy usando openssl para analizar el certificado X509. Logro obtener extensiones, pero no sé cómo extraer el valor de la extensión.openssl obtener extensiones de certificado

El código que estoy utilizando es:

X509_EXTENSION *extension = sk_X509_EXTENSION_pop(exts); 
    int critical = X509_EXTENSION_get_critical(extension); 

    ASN1_OBJECT *obj = extension-> object; 
    ln = OBJ_nid2ln(OBJ_obj2nid(obj)); 
    if(!ln) ln = ""; 
    OBJ_obj2txt(objbuf,sizeof(objbuf),obj,1); 
    int nid = OBJ_txt2nid(ln); 

Este código me dice si la extensión es crítica o no, y me da NID de la extensión.

supongo valor se puede obtener:

ASN1_OCTET_STRING * datos = X509_EXTENSION_get_data (extensión);

pero no estoy seguro de cómo manejar el objeto recuperado data. Se supone que el objeto de datos está der-codificado. ¿Alguna idea sobre cómo obtener los datos de la extensión?

EDIT: Como sugirió here, yo estaba tratando de hacer:

ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(extension); 
const unsigned char* octet_str_data = octet_str->data; 
long xlen; 
int tag, xclass; 
int ret = ASN1_get_object(&octet_str_data, &xlen, &tag, &xclass, octet_str->length); 
printf(@"value: %s\n", octet_str_data); 

pero la cadena llego después de la decodificación es el mismo que antes de ella - algo así como: 4Á˃◊∫NsΣäP∂ W ≠% £ A

+0

Creo que algunos ejemplos de certificado (s) y código que compila bien, simplemente sin la visualización adecuada de los valores de extensión, serían increíblemente útiles. – ThiefMaster

+0

Estoy haciendo un proyecto de iOS, y openssl está compilado para iOS. Aún así, si ayuda, agregaré un enlace a él. – Maggie

+0

iOS? ¿Estás realmente usando C o más bien ObjC? – ThiefMaster

Respuesta

1

Si desea tener una representación textual, puede utilizar una memoria BIO. He respondido a esto para una extensión de Uso de clave en el hilo this, pero la forma de hacerlo es la misma para cada extensión.

Atentamente.

+0

BIO es en realidad un archivo, ¿verdad? – Maggie

+1

Según este [enlace] (http://www.openssl.org/docs/crypto/bio.html): A BIO es una abstracción de E/S, oculta muchos de los detalles de E/S subyacentes de una aplicación. Si una aplicación utiliza un BIO para su E/S, puede gestionar de forma transparente las conexiones SSL, las conexiones de red no cifradas y las E/S de archivos. – Felipe

+1

En otras palabras, un BIO funciona como una secuencia de datos para cualquier E/S, incluida la memoria en sí misma. Por lo tanto, una memoria BIO es solo una transmisión hacia o desde la memoria. BIO también se puede encadenar junto con BIO_push() de una manera muy útil, como se explica [aquí] (http://www.openssl.org/docs/crypto/BIO_push.html) – Felipe

1

Esto es muy interesante. He estado viendo la conversación transpiran across the link you provided y aquí, y estoy de acuerdo con Roger Dahl en su comentario de erratas de su respuesta:

Parece que usted está buscando una solución general sobre cómo extraer la información en una extensión x509v3. Como dice el título de esta pregunta , solo se trata del caso especial de decodificación de un solo OCTET STRING. Más allá de eso, solo puedo indicarle la sugerencia original de @Francois, que es usar un analizador ASN.1 externo, como SNACC o libtasn1 y ver el código fuente de OpenSSL (alrededor de crypto/asn1/asn1_par .c: 135).

(adiciones Enlace mía.)

El truco es que estamos tratando de trabajar con un modelo de extensión modal que no se maneja bien genéricamente. This answer proporciona una buena descripción de cómo funciona eso. En cuanto al resto de la respuesta, estoy de acuerdo con su observación de que donde los documentos fallan, la lectura de the source es honestamente la mejor solución.

+0

gracias por sus sugerencias, eché un vistazo a SNACC, pero por ahora me estoy quedando con openssl y estoy usando la solución que Felipe sugirió. – Maggie

1

Si estuviera en su posición, consideraría seriamente utilizar una de las bibliotecas dedicadas de ASN.1 para decodificar los certificados. Deje que OpenSSL haga lo que es bueno, que es validar sus certificados en una cadena de confianza. Una vez que sepa que tiene un buen certificado, páselo a una biblioteca ASN.1 y déjelo manejar el resto. (SNACC se ve bien). Tenga en cuenta que todo el certificado está codificado con ASN.1, por lo que la misma biblioteca que usaría para manejar las extensiones v3 se puede usar para manejar todo el certificado.

+0

gracias por sus sugerencias, eché un vistazo a SNACC, pero por ahora me estoy quedando con openssl y utilizando la solución que Felipe sugirió. – Maggie

Cuestiones relacionadas