2010-08-05 6 views
12

मैंने एक सीए प्रमाण बनाया है, और इसे सार्वजनिक कुंजी जारी करने के लिए उपयोग किया है। भविष्य में किसी तारीख को, मुझे यह सत्यापित करने की आवश्यकता है कि लोड किया गया प्रमाण पत्र मेरे सीए द्वारा जारी किया गया था।आप अपने निजी सीए द्वारा सार्वजनिक कुंजी जारी करने की पुष्टि कैसे करते हैं?

मैं ओपनएसएसएल एपीआई (सी ++) के साथ ऐसा कैसे करूं?

उत्तर

15

मैं verify.c कम है (openssl/क्षुधा में /) आवश्यक न्यूनतम कार्यों के लिए। धारणाएं: प्रमाण और सीए प्रमाण दोनों पीईएम प्रारूप फाइलें हैं। कोई सीआरएलएस या विश्वसनीय सूची जांच आवश्यक नहीं है।

कॉल प्रमाण() को अपने प्रमाण और सीए पीईएम फ़ाइलों के पथ के साथ सत्यापित करें।

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

आप टिप्पणी के साथ कोड मैं इस सत्यापन प्रक्रिया – Balamurugan

+0

के तर्क यह बजाय स्मृति फ़ाइल उपयोग करना संभव है को समझने में सक्षम नहीं कर रहा हूँ की व्याख्या कर सकते? मैं बी को एक प्रमाणपत्र भेजना चाहता हूं, और सत्यापित करना चाहता हूं। कोई भी कोड साझा करना पसंद करता है? बहुत बहुत धन्यवाद। – user180574

+0

उपयोगकर्ता 180574 - मुझे लगता है कि आपको BIO_new_mem_buf – John

1

openssl verify -CAfile <CA_cert_filename> <unknown_cert_filename> कमांड जो भी आप चाहते हैं वह करेगा - एपीआई को खोजने का प्रयास करना दुखी है जो आप चाहते हैं जो करना होगा, इसलिए मैं openssl verify दिनचर्या के लिए स्रोत कोड ढूंढने का सुझाव दूंगा।

(आप कार्यान्वयन की पसंद है, तो GNUTLS होनहार लग रहा है:

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

लेकिन OpenSSL हर जगह स्थापित है ..)

संबंधित मुद्दे