2

我有一个生成的证书,但我希望能够从证书中提取信息,例如国家、有效性、公钥等。我必须将从证书中检索到的信息与我存储在 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);
}

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

谢谢

4

2 回答 2

4

尝试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)

还要检查t_x509.c的源代码,其中包含X509_print_ex. 这可能是最有用的。

于 2013-04-03T13:23:32.770 回答
2

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

#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)
于 2013-04-03T15:51:35.877 回答