2010-05-03 40 views
6

Tôi có chứng chỉ theo định dạng DER và PEM, mục tiêu của tôi là truy xuất các trường của Tổ chức phát hành và Chủ đề và xác minh chứng chỉ bằng khóa công cộng CA và đồng thời xác minh chứng chỉ CA bằng khóa công cộng gốc. Tôi có thể truy xuất tất cả chi tiết của tổ chức phát hành và chủ đề nhưng không thể xác minh chứng chỉ.
Các API được sử dụng:xác minh chứng chỉ x509 trong C

x509 = d2i_X509_fp (fp, &x509); //READING DER Format 
x509 = PEM_read_X509 (fp, &x509, NULL, NULL); //READING PEM Format 
//to retrieve the Subject: 
X509_NAME_oneline(X509_get_subject_name(x509), subject, sizeof (subject)); 
//to retrieve the Issuer: 
X509_NAME_oneline(X509_get_issuer_name(x509), issuer, sizeof (issuer)); 

//To store the CA public key (in unsigned char *key) that will be used to verify the 
//certificate (in my case always sha1WithRSAEncryption): 
RSA *x = X509_get_pubkey(x509)->pkey.rsa; 
bn = x->n; 
//extracts the bytes from public key & convert into unsigned char buffer 
buf_len = (size_t) BN_num_bytes (bn); 
stored_CA_pubKey = (unsigned char *)malloc (buf_len); 
i_n = BN_bn2bin (bn, (unsigned char *)stored_CA_pubKey); 
if (i_n != buf_len) 
    LOG(ERROR," : key error\n"); 
if (key[0] & 0x80) 
    LOG(DEBUG, "00\n"); 

stored_CA_pubKeyLen = EVP_PKEY_size(X509_get_pubkey(x509)); 

Đối với xác nhận tôi đã đi qua các cách tiếp cận khác nhau nhưng tôi không thể xác minh:

một)

i_x509_verify = X509_verify(cert_x509, ca_pubkey); 

b)

/* verify the signature */ 
int iRet1, iRet2, iReason; 
iRet1 = EVP_VerifyInit(&md_ctx, EVP_sha1()); 
iRet2 = EVP_VerifyUpdate(&md_ctx, cert_code, cert_code_len); 
rv = EVP_VerifyFinal(&md_ctx, (const unsigned char *)stored_CA_pubKey, 
    stored_CA_pubKeyLen, cert_pubkey); 

LƯU Ý : cert_code và saved_CA_pubKey là các bộ đệm char chưa được ký.

Trả lời

11

tôi sử dụng đoạn mã sau để xác thực chứng

init CertStore:

X509_STORE* m_store = X509_STORE_new(); 
X509_LOOKUP* m_lookup = X509_STORE_add_lookup(m_store,X509_LOOKUP_file());  
X509_STORE_load_locations(m_store, "CAFile.pem", NULL); 
X509_STORE_set_default_paths(m_store); 
X509_LOOKUP_load_file(m_lookup,"CAFile.pem",X509_FILETYPE_PEM) 
// alternative lookup by hashdir 
// X509_LOOKUP* m_lookup=X509_STORE_add_lookup(m_store,X509_LOOKUP_hash_dir()); 

VerifyCert:

X509_STORE_CTX *storeCtx = X509_STORE_CTX_new(); 
X509_STORE_CTX_init(storeCtx,m_store,cert,NULL); 
X509_STORE_CTX_set_flags(storeCtx, X509_V_FLAG_CB_ISSUER_CHECK); 
if (X509_verify_cert(storeCtx) == 1) 
{ 
    printf("success"); 
} 
else 
{ 
    printf("Verificatione rror: %s",X509_verify_cert_error_string(storeCtx->error)); 
} 
X509_STORE_CTX_free(storeCtx); 

bạn cũng cần phải dọn dẹp m_store

if(m_store != NULL) 
{ 
    X509_STORE_free(m_store); 
    m_store = NULL; 
} 
+0

trong cửa hàng init cert 2 dòng llookup được sử dụng nhưng được khai báo ở dòng thứ 5 ... cách mã này hoạt động ..? xin vui lòng cung cấp cho các mã đầy đủ – Balamurugan

+0

thx Balamurugan, tôi sao chép chỉ là các phần có liên quan của mã, mã đầy đủ sẽ phức tạp. :) Tra cứu tra cứu thứ hai là một thay thế trong đó các tệp ca được lưu trữ trong một thư mục băm. – pHagi

+0

Bạn nên sử dụng 'X509_STORE_CTX_get_error (storeCtx)' thay vì 'storeCtx-> error'; sau này là mong manh hơn do ABI thay đổi. –

0
X509_STORE* m_store = NULL; 

X509_LOOKUP *m_lookup = NULL; 
X509_STORE_CTX *storeCtx = NULL; 
m_store = X509_STORE_new(); 
if(NULL == m_store) goto exit; 
m_lookup = X509_STORE_add_lookup(m_store, X509_LOOKUP_file()); 
if(NULL == m_lookup) goto exit; 
X509_STORE_load_locations(m_store, CA_CERT_PATH, NULL); 
X509_STORE_set_default_paths(m_store); 
X509_LOOKUP_load_file(m_lookup,CA_CERT_PATH, X509_FILETYPE_ASN1); 
m_lookup = X509_STORE_add_lookup(m_store, X509_LOOKUP_hash_dir()); 
if(NULL == m_lookup) goto exit; 
storeCtx = X509_STORE_CTX_new(); 
if(NULL == storeCtx) goto exit; 
X509_STORE_CTX_init(storeCtx,m_store,cer_x509,NULL); 
X509_STORE_CTX_set_flags(storeCtx, /*X509_V_FLAG_CHECK_SS_SIGNATURE*/0x4000); 
if (X509_verify_cert(storeCtx) == 1) 
{ 
printf("success\n"); 
} 
else 
{ 
printf("Verification error: %s\n",X509_verify_cert_error_string(storeCtx->error)); 
} 
exit: 
    if(NULL != storeCtx) X509_STORE_CTX_free(storeCtx); 
    if(m_store != NULL) 
    { 
     X509_STORE_free(m_store); 
     m_store = NULL; 
    } 

Sau Việc làm này cũng tôi không thể xác minh tự ký giấy chứng nhận

Các vấn đề liên quan