2012-11-28 6 views
6

वापस नहीं आती है I openssl लाइब्रेरी का उपयोग कर सी में प्रमाणपत्र प्रमाणीकरण फ़ंक्शन लिखने का प्रयास कर रहा हूं। चूंकि मैं जिस प्रमाणपत्र को प्रमाणित कर रहा हूं वह स्व-हस्ताक्षरित और समाप्त हो गया है, इसलिए मैं X509_verify_cert() को त्रुटि लौटने की अपेक्षा करता हूं (वापसी मान 1 है और store_ctx-> त्रुटि इसके बजाय X509_V_OK पर सेट है)। आउटपुट 'openssl my_pem_cert_file की पुष्टि':openssl लाइब्रेरी के साथ स्वयं हस्ताक्षरित/समाप्त प्रमाणपत्र को सत्यापित करने से त्रुटि

error 18 at 0 depth lookup:self signed certificate 
error 10 at 0 depth lookup:certificate has expired 

क्या मैं गलत कर रहा हूँ?

static int cert_verify_callback(int ok, X509_STORE_CTX *ctx) 
{ 
    /* Tolerate self-signed certificate */ 
    if (X509_STORE_CTX_get_error(ctx) == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) { 
     return 1; 
    } 

    /* Otherwise don't override */ 
    return ok; 
} 

int cert_validate(const char* certFileName) 
{ 
    BIO *pBio = NULL; 
    X509 *pX509 = NULL; 
    X509 *CA = NULL; 
    X509_STORE *cert_store = NULL; 
    X509_STORE_CTX *store_ctx = NULL; 
    STACK_OF(X509) *stack_of_x509 = NULL; 
    time_t check_time; 
    int store_ctx_error; 
    int store_ctx_error_depth; 


    pBio = BIO_new(BIO_s_file_internal()); 
    if(pBio == NULL) 
     /* error handling */ 

    if(BIO_read_filename(pBio, certFileName) <= 0) 
     /* error handling */ 

    pX509 = PEM_read_bio_X509(pBio, NULL, NULL, NULL); 
    if (pX509 == NULL) 
     /* error handling */ 

    if((cert_store= X509_STORE_new()) == NULL) 
     /* error handling */ 

    if((store_ctx= X509_STORE_CTX_new()) == NULL) 
     /* error handling */ 

    /* edit1: this was wrong: don't add the certificate being verified to the trusted cert list */ 
    /* if(!X509_STORE_add_cert(cert_store, pX509)) */ 
     /* error handling */ 

    if(!X509_STORE_CTX_init(store_ctx, cert_store, CA, stack_of_x509)) 
     /* error handling */ 

    X509_STORE_CTX_set_cert(store_ctx, pX509); 

    /* edit1: this was missing: set the verify time in order to check the certificate for expiry */ 
    time(&check_time); 
    X509_STORE_CTX_set_time(store_ctx, 0, check_time); 
    X509_STORE_CTX_set_flags(store_ctx, X509_V_FLAG_USE_CHECK_TIME); 

    /* edit1: add callback function for ignoring self-signed error 
    * now, I'd like the validation to fail because of the expiry */ 
    X509_STORE_set_verify_cb_func(store_ctx, cert_verify_callback); 

    switch(X509_verify_cert(store_ctx)) { 
     /* the certificate is valid */ 
     case 1: 
      printf("The certificate is valid\n"); 

      break; 

     /* the certificate cannot be validated */ 
     case -1: 
     case 0: 
      printf("The certificate is not valid\n"); 

      store_ctx_error= X509_STORE_CTX_get_error(store_ctx); 
      store_ctx_error_depth= X509_STORE_CTX_get_error_depth(store_ctx); 
      printf("Error %d at %d depth: %s\n", store_ctx_error, store_ctx_error_depth, X509_verify_cert_error_string(store_ctx->error)); 

     default: 
      break; 
    } 

    /* free data ... */ 
} 

जब स्व-हस्ताक्षरित और समाप्त हो गई है प्रमाण पत्र मान्य है, मेरे समारोह प्रिंट: त्रुटि 0 0 गहराई में: ठीक

उत्तर

5

समारोह X509_STORE_add_cert() के लिए एक विश्वसनीय प्रमाणपत्र के रूप में इसी प्रमाण पत्र कहते हैं यहाँ मेरी कोड है सत्यापन, इसलिए इस लाइन:

X509_STORE_add_cert(cert_store, pX509) 

का कहना है कि अपने pX509 प्रमाण पत्र सत्यापन के लिए पर भरोसा किया है - लेकिन यह है कि, प्रमाण पत्र आप परीक्षण करना चाहते है, तो यही कारण है कि स्व-हस्ताक्षरित प्रमाणपत्र है प्रमाण पत्र सत्यापन पास हो रहा है।

आप भी एक सत्यापन समय निर्धारित नहीं कर रहे हैं - यही कारण है कि एक कालबाह्य प्रमाणपत्र का पता नहीं लगाया जा रहा है। X509_STORE_CTX_set_time() के साथ सत्यापन समय सेट करें।

+0

बहुत बहुत धन्यवाद! मैंने उन त्रुटियों को सही करने के लिए अपना कोड अपडेट कर लिया है। उभरती एक और समस्या है: चूंकि मैं स्वयं हस्ताक्षरित त्रुटि को सहन करना चाहता हूं, मैं समाप्त होने वाली त्रुटि त्रुटि का पता कैसे लगा सकता हूं? मुझे लगता है कि X509_verify_cert() को एक बार कॉल करना, आप पहली त्रुटि का सामना करते हैं। मैं 'openssl verify' कमांड जैसी सभी प्रमाणपत्र त्रुटियों का पता कैसे लगा सकता हूं? (अब मैं चाहता हूं कि 'प्रमाणपत्र प्रमाणित नहीं है' प्रमाण पत्र समाप्त होने के बाद मेरा प्रमाणपत्र_ वैध() प्रमाणित है) – claudiu

+0

@ कैफ, कृपया इस प्रश्न के साथ मेरी सहायता करें: http://stackoverflow.com/questions/27599985/ openssl रूप से सत्यापन-ERRORCODE-20-असमर्थ करने वाली मिलता है-स्थानीय जारीकर्ता-प्रमाण पत्र –