проверка подписи х509 - PullRequest
       5

проверка подписи х509

2 голосов
/ 28 апреля 2010

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

EVP_F_EVP_PKEY_GET1_DH

Моя цель - проверить подпись сертификата. У меня есть 2 сертификата: 1. сертификат CA 2. сертификат, выданный СА. Я извлек модуль «Открытый ключ RSA (ключ)» из сертификата 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, а также сертификат, выданный 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

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

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

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

0 голосов
/ 24 мая 2013

Это способ проверки сертификата:

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

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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...