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ý.
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
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
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. –