2010-04-28 1 views
2

При проверке сертификата я получаюпроверки подписи x509

EVP_F_EVP_PKEY_GET1_DH

Моя цель - Проверить подпись сертификата. У меня есть 2 сертификата: 1. сертификат CA 2. сертификат, выданный CA. я извлечена 'RSA Public Key (ключ)' Modulus От CA сертификат с использованием,

pPublicKey = X509_get_pubkey(x509); 
buf_len = (size_t) BN_num_bytes (bn); 
key = (unsigned char *)malloc (buf_len); 
n = BN_bn2bin (bn, (unsigned char *) key); 
if (n != buf_len) 
    LOG(ERROR," : key error\n"); 
if (key[0] & 0x80) 
    LOG(DEBUG, "00\n"); 

Теперь у меня есть открытый ключ & CA длиной ключа CA, а также имеющие сертификат, выданный ЦС в буфер, длина буфера & общественности ключ. Чтобы проверить подпись, у меня есть следующий код:

int iRet1, iRet2, iRet3, iReason; 

iRet1 = EVP_VerifyInit(&md_ctx, EVP_sha1()); 
iRet2 = EVP_VerifyUpdate(&md_ctx, buf, buflen); 
iRet3 = EVP_VerifyFinal(&md_ctx, (const unsigned char *)CAkey, CAkeyLen, pubkey); 
iReason = ERR_get_error(); 
if(ERR_GET_REASON(iReason) == EVP_F_EVP_PKEY_GET1_DH) 
{ 
    LOG(ERROR, "EVP_F_EVP_PKEY_GET1_DH\n"); 
} 
LOG(INFO,"EVP_VerifyInit returned %d : EVP_VerifyUpdate returned %d : EVP_VerifyFinal = %d \n", iRet1, iRet2, iRet3); 

EVP_MD_CTX_cleanup(&md_ctx); 
EVP_PKEY_free(pubkey); 
if (iRet3 != 1) 
{ 
    LOG(ERROR,"EVP_VerifyFinal() failed\n"); 
    ret = -1; 
} 
LOG(INFO,"signature is valid\n"); 

Я не могу понять, что могло бы пойти не так ??? Пожалуйста, если кто-то сталкивался с такими же проблемами? Что EVP_F_EVP_PKEY_GET1_DH Ошибка означает?

Заранее спасибо - opensid

ответ

1

X509 сертификаты не подписаны, используя тот же метод, как функции шифрования конверт OpenSSL, так EVP_* неправильный инструмент для работы.

Правильная функция - это только X509_verify(x509, X509_get_pubkey(x509)) (для самозаверяющего сертификата).

+0

HI caf, Спасибо за ваш ответ. Мне понравился «X509_verify (self_x509, X509_get_pubkey (CA_x509)), но он возвращает -1. Еще одна вещь, которую я хочу упомянуть, - длина открытого ключа CA RSA - 256 в Ubuntu (с использованием API-интерфейса openssl «EVP_PKEY_size» (X509_get_pubkey (x509)) ») и 270 в Windows (всплывающее окно сертификата). Я чувствую, что это может быть проблемой. – openssid

+0

привет, вы можете рассказать мне, как вы проверили, используя цепочку доверия ' – Balamurugan

0

Это способ сделать, чтобы проверить сертификат:

У меня есть сертификат хранится локально на моем компьютере, я загрузил его, а затем я проверить его против себя, как в моем случае это само сертификат. Если у вас есть корневой ЦС и сертификат, подписанный с этим корневым сертификатом, он должен работать одинаково.

int verify_certificate(const char* certfile, const char* CAfile) 
{ 
    int ret=0; 
    X509_STORE *cert_ctx=NULL; 
    X509_LOOKUP *lookup=NULL; 

    cert_ctx=X509_STORE_new(); 
    if (cert_ctx == NULL) goto end; 

    OpenSSL_add_all_algorithms(); 

    lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_file()); 
    if (lookup == NULL) 
     goto end; 

    if(!X509_LOOKUP_load_file(lookup,CAfile,X509_FILETYPE_PEM)) 
     goto end; 

    lookup=X509_STORE_add_lookup(cert_ctx,X509_LOOKUP_hash_dir()); 
    if (lookup == NULL) 
     goto end; 

    X509_LOOKUP_add_dir(lookup,NULL,X509_FILETYPE_DEFAULT); 

    ret = check(cert_ctx, certfile); 
end: 
    if (cert_ctx != NULL) X509_STORE_free(cert_ctx); 

    return ret; 
} 

X509 *load_cert(const char *file) 
{ 
    X509 *x=NULL; 
    BIO *cert; 

    if ((cert=BIO_new(BIO_s_file())) == NULL) 
     goto end; 

    if (BIO_read_filename(cert,file) <= 0) 
     goto end; 

    x=PEM_read_bio_X509_AUX(cert,NULL, NULL, NULL); 
end: 
    if (cert != NULL) BIO_free(cert); 
    return(x); 
} 

int check(X509_STORE *ctx, const char *file) 
{ 
    X509 *x=NULL; 
    int i=0,ret=0; 
    X509_STORE_CTX *csc; 

    x = load_cert(file); 
    if (x == NULL) 
     goto end; 

    csc = X509_STORE_CTX_new(); 
    if (csc == NULL) 
     goto end; 
    X509_STORE_set_flags(ctx, 0); 
    if(!X509_STORE_CTX_init(csc,ctx,x,0)) 
     goto end; 
    i=X509_verify_cert(csc); 
    X509_STORE_CTX_free(csc); 

    ret=0; 
end: 
    ret = (i > 0); 
    if (x != NULL) 
     X509_free(x); 

    return(ret); 
} 

Все, что вам нужно сделать, это реализовать эти 3 функции, а затем вызвать:

int verify_certificate(const char* certfile, const char* CAfile) 

Надеется, что это помогает. С наилучшими пожеланиями