2010-08-05 8 views

Respuesta

15

he reducido verify.c (en openssl/apps /) a las funciones mínimas requeridas. Suposiciones: cert y CA cert son ambos archivos de formato PEM. No hay CRLS o se requieren verificaciones de lista de confianza.

Llamar verify() con la ruta de acceso a sus archivos cert y CA PEM.

static int verify(const char* certfile, const char* CAfile); 
static X509 *load_cert(const char *file); 
static int check(X509_STORE *ctx, const char *file); 

int verify(const char* certfile, const char* CAfile) 
{ 
    int ret=0; 
    X509_STORE *cert_ctx=NULL; 
    X509_LOOKUP *lookup=NULL; 

    cert_ctx=X509_STORE_new(); 
    if (cert_ctx == NULL) goto end; 

    OpenSSL_add_all_algorithms(); 

    lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_file()); 
    if (lookup == NULL) 
     goto end; 

    if(!X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM)) 
     goto end; 

    lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_hash_dir()); 
    if (lookup == NULL) 
     goto end; 

    X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT); 

    ret = check(cert_ctx, certfile); 
end: 
    if (cert_ctx != NULL) X509_STORE_free(cert_ctx); 

    return ret; 
} 

static X509 *load_cert(const char *file) 
{ 
    X509 *x=NULL; 
    BIO *cert; 

    if ((cert=BIO_new(BIO_s_file())) == NULL) 
     goto end; 

    if (BIO_read_filename(cert,file) <= 0) 
     goto end; 

    x=PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL); 
end: 
    if (cert != NULL) BIO_free(cert); 
    return(x); 
} 

static int check(X509_STORE *ctx, const char *file) 
{ 
    X509 *x=NULL; 
    int i=0,ret=0; 
    X509_STORE_CTX *csc; 

    x = load_cert(file); 
    if (x == NULL) 
     goto end; 

    csc = X509_STORE_CTX_new(); 
    if (csc == NULL) 
     goto end; 
    X509_STORE_set_flags(ctx, 0); 
    if(!X509_STORE_CTX_init(csc,ctx,x,0)) 
     goto end; 
    i=X509_verify_cert(csc); 
    X509_STORE_CTX_free(csc); 

    ret=0; 
end: 
    ret = (i > 0); 
    if (x != NULL) 
     X509_free(x); 

    return(ret); 
} 
+4

puede explicar el código con comentarios que no soy capaz de entender la lógica de este proceso de verificación – Balamurugan

+0

¿Es posible utilizar la memoria en lugar del archivo? Me gustaría tener un certificado A enviado a B y verificarlo. ¿Alguien quiere compartir el código? Muchas gracias. – user180574

+0

usuario180574 - Creo que necesita utilizar BIO_new_mem_buf – John

1

El comando openssl verify -CAfile <CA_cert_filename> <unknown_cert_filename> hará lo que quieras; es desafortunado tratar de encontrar la API que hará lo que quieras, así que te sugiero que encuentres el código fuente para la rutina openssl verify.

(Si usted tiene la elección de las implementaciones, gnutls parece prometedor:

#include <gnutls/x509.h> 

    int gnutls_x509_crt_verify(gnutls_x509_crt_t cert, const gnutls_x509_crt_t 
    * CA_list, int CA_list_length, unsigned int flags, unsigned int * verify); 

Pero OpenSSL es instalado en todas partes ..)

Cuestiones relacionadas