【问题标题】:How to programmatically extract information from certificate?如何以编程方式从证书中提取信息?
【发布时间】:2013-04-03 12:49:55
【问题描述】:

我有一个生成的证书,但我希望能够从证书中提取信息,例如国家、有效期、公钥等。我必须将从证书中检索到的信息与我存储在 C 程序中的其他信息进行比较。

我知道如果我使用这样的功能,它会打印我的证书信息:

void print_certificate(const char* cert)
{
    X509 *x509 = NULL;
    BIO *i = BIO_new(BIO_s_file());
    BIO *o = BIO_new_fp(stdout,BIO_NOCLOSE);

    if((BIO_read_filename(i, cert) <= 0) ||
       ((x509 = PEM_read_bio_X509_AUX(i, NULL, NULL, NULL)) == NULL)) {
           printf("Bad certificate, unable to read\n");
    }

    X509_print_ex(o, x509, XN_FLAG_COMPAT, X509_FLAG_COMPAT);   

    if(x509)
        X509_free(x509);
}

但我想要的只是这些信息的一部分。怎么办?

谢谢

【问题讨论】:

    标签: c openssl certificate x509 pkix


    【解决方案1】:

    试试grep _get_ /usr/include/openssl/x509.h

    这里有一些你可能会觉得有用的东西:

    EVP_PKEY *  X509_get_pubkey(X509 *x);
    #define     X509_CRL_get_issuer(x) ((x)->crl->issuer)
    #define     X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
    #define     X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
    

    还要检查包含X509_print_ext_x509.c 的源代码。这可能是最有用的。

    【讨论】:

    • EVP_PKEY * X509_get_pubkey(X509 *x);从此 EVP_PKEY 如何将其转换为 EC_KEY 以便我可以在我的情况下验证签名。非常感谢您的快速回答。
    • 使用的问题已解决:EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey);谢谢:)
    【解决方案2】:

    请参阅 OpenSSL 的 x509.h(例如 here)。你会发现很多有用的功能。 示例:

    #define     X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version)
    /* #define  X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */
    #define     X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
    #define     X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
    #define     X509_extract_key(x) X509_get_pubkey(x) /*****/
    #define     X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version)
    #define     X509_REQ_get_subject_name(x) ((x)->req_info->subject)
    #define     X509_REQ_extract_key(a) X509_REQ_get_pubkey(a)
    #define     X509_name_cmp(a,b)  X509_NAME_cmp((a),(b))
    #define     X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm))
    
    #define     X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version)
    #define     X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate)
    #define     X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate)
    #define     X509_CRL_get_issuer(x) ((x)->crl->issuer)
    #define     X509_CRL_get_REVOKED(x) ((x)->crl->revoked)
    
    /* This one is only used so that a binary form can output, as in
     * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */
    #define     X509_get_X509_PUBKEY(x) ((x)->cert_info->key)
    

    【讨论】:

    • 您好,感谢您的回答,我正在尝试将公钥转换为 EC_KEY 格式,以便验证消息的签名。以下命令返回一个 EVP_PKEY,但如何将其转换为 EC_KEY? EVP_PKEY pk = EVP_PKEY_new(); pk = X509_get_pubkey(证书);我找到了这个,但我认为这是相反的,它将 EC_KEY 和 EVP_PKEY 放入。 EC_KEY 公钥 EVP_PKEY_assign_EC_KEY(pk, publickey);
    猜你喜欢
    • 2011-09-24
    • 2012-11-28
    • 2016-06-14
    • 1970-01-01
    • 2016-09-28
    • 2020-03-20
    • 1970-01-01
    • 2022-10-19
    • 1970-01-01
    相关资源
    最近更新 更多