2010-08-05 3 views

Antwort

15

Ich habe verify.c reduziert (in openssl/apps /) zu den erforderlichen Mindestfunktionen. Annahmen: cert und CA cert sind beide Dateien im PEM-Format. Es sind keine CRLS- oder Vertrauenslistenüberprüfungen erforderlich.

Rufen Sie verify() mit dem Pfad zu Ihren Cert- und CA PEM-Dateien auf.

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

können Sie den Code mit Kommentaren erklären i nicht in der Lage bin, die Logik dieses Überprüfungsprozesses zu verstehen – Balamurugan

+0

Ist es möglich, Speicher zu verwenden, anstatt die Datei? Ich möchte A senden Zertifikat an B, und überprüfen. Möchte jemand den Code teilen? Danke vielmals. – user180574

+0

user180574 - Ich denke, Sie müssen verwenden BIO_new_mem_buf – John

1

Der Befehl openssl verify -CAfile <CA_cert_filename> <unknown_cert_filename> wird tun, was Sie wollen - es ist miserabel zu versuchen, die API zu finden, die tun wird, was Sie wollen, also würde ich vorschlagen, den Quellcode für die openssl verify Routine zu finden.

(Wenn Sie Wahl von Implementierungen haben, sieht gnutls vielversprechend:

#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); 

Aber OpenSSL ist überall installiert ..)