9
votes

X509 Vérification du certificat en C

J'ai des certificats dans le format DER et PEM, mon objectif est de récupérer les champs d'émetteur et de la matière et de vérifier le certificat avec la clé publique CA et vérifiez simultanément le certificat CA avec la clé publique racine. Je suis capable de récupérer tous les détails de l'émetteur et du sujet, mais pas en mesure de vérifier le certificat. de
L'API a utilisé:

/* 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);


0 commentaires

3 Réponses :


12
votes

J'utilise le code suivant pour vérifier un certificat

initt CertStore: xxx

Verifycert: xxx vous également besoin de nettoyer m_store xxx


3 commentaires

Dans Init Cert Store 2 Line Llookup est utilisé mais déclaré dans la 5ème ligne ... Comment ce code fonctionne ..? Pls donner le code complet


THX BALAMURUGAN, j'ai copié juste les pièces pertinentes du code, le code complet serait à complexe. :) Le deuxième init de recherche est une alternative où les fichiers CA sont stockés dans un répertoire de hasch.


Vous devez utiliser x509_store_ctx_get_error (STORTectX) au lieu de STORECTX-> Erreur ; Ce dernier est plus fragile en raison de changements abi.



2
votes
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;
    }
After Doing this also I am unable to verify Self signed certificate

1 commentaires

J'ai essayé quelque chose de similaire mais la vérification du certificat de certification auto-signée ne fonctionne pas. Même manuellement installé manuellement le cert dans ma machine en utilisant le logement enfichable "Gérer des certificats d'ordinateur". Toute aide serait appréciée. X509_store_ctx * ctx; ctx = x509_store_ctx_new (); X509_store * Store = x509_store_new (); X509_store_add_cert (magasin, certificat); X509_store_ctx_init (CTX, Store, Certificat, NULL); X509_verify_param * param = null; param = x509_verify_param_new (); if (param) {x509_verify_param_set_flags (param, x509_v_flag_check_ss_sign Ature);} Statut = x509_Verify_cert (CTX);



5
votes

Jetez un coup d'œil à ma question à réponse automatique: https://stackoverflow.com/questions/3412032/OPENSSL-C-Commandez -do-You-Verify-A-Public-Key-a été émis-by-votre-privé-ca Cela contribue beaucoup à faire ce dont vous avez besoin.


0 commentaires