首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用X509_verify()

如何使用X509_verify()
EN

Stack Overflow用户
提问于 2013-05-09 20:24:36
回答 3查看 6.9K关注 0票数 4

我们如何使用X509_verify()。我有两张证书。第一个证书是签署下一个证书(即我的证书)的根证书。因此,我想检查我的证书是否由C++中使用x509_verify()的根证书签名。我的目标是让代码简单易懂,这样我也可以把它放到网上。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 13:09:10

X509_verify的签名是

代码语言:javascript
运行
复制
 int X509_verify(X509 * x509, EVP_PKEY * pkey);

假设你在root中有根证书,在mycert中有证书;

代码语言:javascript
运行
复制
   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);

我想这会对你有帮助。

票数 12
EN

Stack Overflow用户

发布于 2014-03-08 13:56:09

我认为dbasic和Balamurugan已经回答了如何使用它。下面是如何解释你从中得到的错误。我发现错误处理比业务逻辑重要得多,因为几乎任何人都可以复制/粘贴在良性环境中工作的代码。你如何应对失败,坏的/坏的输入和敌对的环境更重要。

该函数的源代码在<openssl dir>/crypto/x509/x_all.c

代码语言:javascript
运行
复制
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));
    }

<openssl dir>/crypto/asn1/a_verify.c中定义的ASN1_item_verify id

代码语言:javascript
运行
复制
int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *alg,
        ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey)
    {
        ...
    }

该函数在失败时返回-1,并显示以下错误代码之一:

如果pkeyNULL

  • ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM则为
  • ERR_R_PASSED_NULL_PARAMETER如果alg未知则使用OID如果pkey类型与OID不匹配如果缓冲区分配失败

该函数在失败时返回0,并显示以下错误代码之一:

if

  • ERR_R_EVP_LIB if fails
  • ERR_R_EVP_LIB if EVP_DigestVerifyUpdate fails
  • ERR_R_EVP_LIB if EVP_DigestVerifyFinal

ifEVP_DigestVerifyFinalfails EVP_DigestVerifyInit ifEVP_DigestVerifyUpdatefailsEVP_DigestVerifyFinal

如果成功,函数将返回1(在第220行附近):

代码语言:javascript
运行
复制
    ...
    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()检索错误代码:

代码语言:javascript
运行
复制
err.h:#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__)
票数 4
EN

Stack Overflow用户

发布于 2013-06-19 13:25:28

Step1 :读取证书并将证书转换为X509结构//下面将显示如何从文件中读取证书(DER或PEM编码)

代码语言:javascript
运行
复制
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是否为空)

步骤3:使用X509_verify()函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16461720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档