2012-03-10 7 views
7

Estoy usando openssl para obtener datos sobre el certificado x509. ¿Hay alguna forma de convertir ASN1_INTEGER en ASN1_STRING, que puede transformarse fácilmente en una matriz de caracteres? ¿Hay alguna forma de convertirlo a cualquier otro formato legible para humanos?ASN1_INTEGER a ASN1_STRING

EDIT: Estoy usando openssl compilado para iOS, ya que estoy teniendo el proyecto de iOS. Aquí está el código que estoy utilizando para extraer el número de serie del certificado:

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509); 
long value = ASN1_INTEGER_get(serial); 
NSLog(@"Serial %ld", value); 

certificateX509 es un objeto X509 válido y que han logrado obtener algunos otros campos de ella (nombre del emisor, fecha de caducidad, etc.)

EDIT 2:
finalmente llegué a una solución, que puede no ser el más sencillo uno:

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509); 
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL); 
int n = BN_num_bytes(bnser); 
unsigned char outbuf[n]; 
int bin = BN_bn2bin(bnser, outbuf); 
char *hexbuf = (char*) outbuf; 

hexBuf a continuación contiene caracteres cuyo valor debe ser leído como un entero hexadecimal en el orde r para recuperar valores lógicos. utilizo NSMutableString para crear una cadena legible por humanos:

NSMutableString *str = [[NSMutableString alloc] init]; 
for (int i=0; i<n; i++) { 
    NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]]; 
    [str appendString:[NSString stringWithFormat:@"%@ ", temp]]; 
} 

Si hay una manera más sencilla, realmente me gustaría saberlo.

Respuesta

2

finalmente llegaron a una solución, que puede no ser el más sencillo uno:

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509); 
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL); 
int n = BN_num_bytes(bnser); 
unsigned char outbuf[n]; 
int bin = BN_bn2bin(bnser, outbuf); 
char *hexBuf = (char*) outbuf; 

hexBuf a continuación contiene caracteres cuyo valor debe ser leído como un entero hexadecimal con el fin de recuperar los valores lógicos. utilizo NSMutableString para crear una cadena legible por humanos:

NSMutableString *str = [[NSMutableString alloc] init]; 
    for (int i=0; i<n; i++) { 
    NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]]; 
    [str appendString:[NSString stringWithFormat:@"%@ ", temp]]; 
} 
5

Una posibilidad es que se puede extraer el valor de la ASN1_INTEGER como un entero normal de C:

#include <openssl/asn1.h> 
#include <stdio.h> 

int main(int argc, char** argv) { 
    long value; 
    ASN1_INTEGER asn1int = {0}; 

    ASN1_INTEGER_set(&asn1int, 42); 
    value = ASN1_INTEGER_get(&asn1int); 
    printf("The value is %ld.\n", value); 

    return 0; 
} 

Compilado como esto:

gcc -Wall -o sploots sploots.c -lcrypto 

esto produce la salida:

The value is 42. 

Para tener el valor como una cadena en una matriz de caracteres, use snprintf.

Sospecho que también hay posibilidades de usar las rutinas de impresión BIO para volcar el valor a un BIO de algún tipo (quizás una memoria BIO). Sin embargo, este enfoque parece más simple.

La forma en que llegué a esta respuesta es que miré a través de los encabezados de OpenSSL para ASN1_INTEGER. Después de buscar las API adecuadas para una solución basada en BIO, noté la función ASN1_INTEGER_get.

Mirar en los archivos de cabecera de OpenSSL suele ser la manera en que aprendo a utilizar OpenSSL, ya que gran parte de la API no está documentada o documentada de forma incorrecta o incompleta.

+0

No estoy seguro de lo que está preguntando, pero para los números de serie del certificado probablemente no sea muy útil. Por ejemplo, he comprobado un certificado y el número de serie es "3c 08 cf ee be 9f eb c4 2b b1 3e e0 3d 62 0b df". Es cierto que no hay otra manera más que abrir los archivos de encabezado y extraer la información. –

+0

tienes razón, eso no funciona para mí. Siempre obtengo -1 como un valor largo – Maggie

+0

Parece que no obtiene un ASN1_INTEGER del certificado. Tal vez es un BIGNUM? ¿Puedes agregar el código que usaste para extraerlo del certificado a la pregunta? –

10

hacerse la conversión hexadecimal ascii más simplemente utilizando el construido en BN_bn2hex (bignum *) Función

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509); 
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL); 
char *asciiHex = BN_bn2hex(bnser); 
1

Si lo que desea es un NSString legible , BN_bn2dec es más consize que BN_bn2hex o BN_bn2bin.
No hay necesidad de meterse con la codificación hexadecimal.

Aquí es mi manera, en IOS/ObjC, utilizando pod 'OpenSSL-Universal', '1.0.2.10':

ASN1_INTEGER *serialAsn1 = X509_get_serialNumber(certX509); 
BIGNUM *serialBigNumber = ASN1_INTEGER_to_BN(serialAsn1, NULL); 
char *serialChar = BN_bn2dec(serialBigNumber); 

NSString *serialString = [NSString stringWithCString:(const char *) serialChar 
              encoding:NSUTF8StringEncoding]; 

Saludos.

Cuestiones relacionadas