2013-04-03 59 views
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

尝试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。这可能是最有用的。

+0

EVP_PKEY * X509_get_pubkey(X509 * x);从这个EVP_PKEY如何将它变成EC_KEY,以便我可以在我的情况下验证签名。非常感谢您的快速回答。 – mmm

+2

已解决的问题已使用:EC_KEY * EVP_PKEY_get1_EC_KEY(EVP_PKEY * pkey);谢谢:) – mmm

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) 
+0

你好, 感谢您的答案,我试图让公钥到EC_KEY格式,以便我可以验证 邮件的签名。 以下命令返回给我一个EVP_PKEY,但是如何将其转换为EC_KEY? \t \t EVP_PKEY * pk = EVP_PKEY_new(); \t pk = X509_get_pubkey(certificate); \t 我发现这一点,但我认为这是相反的,它将EC_KEY放入EVP_PKEY中。 \t EC_KEY * publickey EVP_PKEY_assign_EC_KEY(pk,publickey); – mmm

相关问题