2013-04-03 104 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

相關問題