Как использовать X509_verify ()

Как мы можем использовать X509_verify (). У меня есть два сертификата. Первый сертификат — это корневой сертификат, который подписал следующий сертификат (который является моим сертификатом). Поэтому я хочу проверить, подписан ли мой сертификат корневым сертификатом, используя x509_verify () в C ++. Моя цель — сделать код простым и понятным, чтобы я также мог разместить его в сети.

4

Решение

Подпись X509_verify есть

 int X509_verify(X509 * x509, EVP_PKEY * pkey);

Предположим, у вас есть корневой сертификат в root и ваш сертификат в mycert;

   X509 * root;
X509 * mycert;

//Get root certificate into root
//Get mycert into mycert.

//Get the public key.
EVP_PKEY * pubkey = X509_get_pubkey(root);

//verify. result less than or 0 means not verified or some error.
int result = X509_verify(mycert, pubkey);

//free the public key.
EVP_PKEY_free(pubkey);

Я думаю, что это поможет вам.

9

Другие решения

Шаг 1. Считайте сертификат и преобразуйте его в структуру X509.
// ниже показано, как прочитать сертификат из файла (DER или PEM Encoded)

X509* oCertificate=NULL;
FILE *lFp=NULL;
lFp=fopen(iFilePath.c_str(),"rb");  // iFilepath is the string
if(lFp==NULL)
{
oCertificate=NULL;
}
else
{
oCertificate = PEM_read_X509(lFp, NULL, NULL, NULL);
if (oCertificate  == NULL )
{
//Certificate may be DER encode
oCertificate = d2i_X509_fp(lFp, NULL);
}
fclose(lFp);
}
// OCertificate contains

Шаг 2: теперь прочитайте ключ корневого сертификата
(Обратите внимание, что X509 имеет значение NULL или нет перед использованием)

Шаг 3: используйте функцию X509_verify ().

3

Я думаю, что dbasic и Balamurugan ответили, как его использовать. Вот как интерпретировать ошибки, которые вы получаете от него. Я считаю, что обработка ошибок гораздо важнее, чем бизнес-логика, потому что почти каждый может копировать / вставлять код, который работает в благоприятной среде. То, как вы реагируете на сбои, сломанные / плохие входы и неблагоприятную среду, имеет большее значение.

Исходный код функции находится в <openssl dir>/crypto/x509/x_all.c:

int X509_verify(X509 *a, EVP_PKEY *r)
{
return(ASN1_item_verify(ASN1_ITEM_rptr(X509_CINF),a->sig_alg,
a->signature,a->cert_info,r));
}

ASN1_item_verify идентификатор определен в <openssl dir>/crypto/asn1/a_verify.c:

int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *alg,
ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey)
{
...
}

Функция возвращает -1 при ошибке с одним из следующих кодов ошибки:

  • ERR_R_PASSED_NULL_PARAMETER если pkey является NULL
  • ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM если alg неизвестно с помощью поиска OID
  • ASN1_R_WRONG_PUBLIC_KEY_TYPE если pkey тип не соответствует pkey->method
  • ERR_R_MALLOC_FAILURE если сбой выделения буфера

Функция возвращает 0 при ошибке с одним из следующих кодов ошибки:

  • ERR_R_EVP_LIB если EVP_DigestVerifyInit терпит неудачу
  • ERR_R_EVP_LIB если EVP_DigestVerifyUpdate терпит неудачу
  • ERR_R_EVP_LIB если EVP_DigestVerifyFinal терпит неудачу

В случае успеха функция возвращает 1 (из строки 220):

    ...
if (EVP_DigestVerifyFinal(&ctx,signature->data,
(size_t)signature->length) <= 0)
{
ASN1err(ASN1_F_ASN1_ITEM_VERIFY,ERR_R_EVP_LIB);
ret=0;
goto err;
}

ret=1;

err:
EVP_MD_CTX_cleanup(&ctx);
return(ret);

} /* End of function */

От <openssl dir>/crypto/err/err.h, ты используешь ERR_get_error() чтобы получить код ошибки:

err.h:#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__)
3
По вопросам рекламы [email protected]