Ich habe Zertifikate im DER- und PEM-Format. Mein Ziel ist es, die Felder Aussteller und Subjekt abzurufen und das Zertifikat mit dem öffentlichen Schlüssel CA zu überprüfen und gleichzeitig CA-Zertifikat mit dem öffentlichen Schlüssel zu verifizieren. Ich kann alle Details von Aussteller und Betreff abrufen, aber das Zertifikat nicht überprüfen.
Die API verwendet:x509 Zertifikatsverifizierung in 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));
Für Überprüfung ging ich durch verschiedene Ansätze, aber ich bin nicht in der Lage zu überprüfen:
a)
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);
HINWEIS : cert_code und stored_CA_pubKey sind vorzeichenlose Zeichenpuffer.
in init cert store 2 Zeile llookup wird verwendet, aber in der 5. Zeile deklariert ... wie funktioniert dieser Code ..? Bitte geben Sie den vollständigen Code – Balamurugan
thx Balamurugan, kopierte ich nur die relevanten Teile des Codes, wäre der vollständige Code zu komplex. :) Die zweite Init der Suche ist eine Alternative, wo die CA-Dateien in einem Hash-Verzeichnis gespeichert sind. – pHagi
Sie sollten 'X509_STORE_CTX_get_error (storeCtx)' anstelle von 'storeCtx-> error'; Letzteres ist aufgrund von ABI-Änderungen fragiler. –