2012-04-04 25 views
2

私はX509構造化証明書からキー使用法値を取得したい、私はlKeyusage値を印刷するとき、次のコードX509証明書からKeyusageの値を取得する方法は?

X509* lcert=NULL; 
lCert=PEM_read(filename); // function will return the certificate in X509 
unsigned long lKeyusage= lCert->ex_kusage; 

が..私は128を取得するいくつかの時間が...時々私は0を取得してみました同じ証明書.. エラーが何であるか教えてください。 私は...私にいくつかのサンプルコードや正しいAPIをお願い間違っ

+0

私はこのスレッドで可能な解決策を提案します:http://stackoverflow.com/questions/9991147/how-to-read-the-keyusage-of-a-x509-v3-certificate/24714773#24714773 –

答えて

7

をやっている場合は、私が最も簡単な方法は、メモリBIO使用することだと思う:精巣の証明のために、私の場合は

... 
X509 *lcert = NULL; 
BUF_MEM *bptr = NULL; 
char *buf = NULL; 
int loc; 

FILE *f = fopen("your cert goes here", "rb"); 
if((lcert = PEM_read_X509(f, &lcert, NULL, NULL)) == NULL){ 
    // error handling... 
} 

loc = X509_get_ext_by_NID(lcert, NID_key_usage, -1); 
X509_EXTENSION *ex = X509_get_ext(lcert, loc); 

BIO *bio = BIO_new(BIO_s_mem()); 
if(!X509V3_EXT_print(bio, ex, 0, 0)){ 
    // error handling... 
} 
BIO_flush(bio); 
BIO_get_mem_ptr(bio, &bptr); 

// now bptr contains the strings of the key_usage, take 
// care that bptr->data is NOT NULL terminated, so 
// to print it well, let's do something.. 
buf = (char *)malloc((bptr->length + 1)*sizeof(char)); 

memcpy(buf, bptr->data, bptr->length); 
buf[bptr->length] = '\0'; 

// Now you can printf it or parse it, the way you want... 
printf ("%s\n", buf); 

... 

を、それが"デジタル署名、否認防止、鍵の暗号化"を印刷しました

他にも、ASN1_BIT_STRING *のような使い方があります。上記があなたのニーズに合わない場合は、私はあなたを見せてくれるでしょう。

よろしくお願いいたします。

+1

このコードキーの使用法は読み取り可能な形式でのみ印刷されます。 – Balamurugan

2

私は以下のコードを使用してキーの使用量を取得しました。 方法1;

//iCertificate is in X509 format 
    ASN1_BIT_STRING* lASN1UsageStr; 
    lASN1UsageStr=(ASN1_BIT_STRING *)X509_get_ext_d2i(iCertificate,NID_key_usage,NULL,NULL); 
    if(lASN1UsageStr == NULL) 
    { 
     cout<<" get ext_d2i function returns errors"; 
    } 
    else if(lASN1UsageStr->length > 0) 
    { 
     lKeyUsage = lASN1UsageStr->data[0]; 
     if(lASN1UsageStr->length > 1) 
     { 
       lKeyUsage |= lASN1UsageStr->data[1] << 8; 
     }// else{}  
    } else 
    { 
     lKeyUsage = -1; //invalid keyusage 
    }     

方法2:ssl\ssl_lib.cから

 X509_check_ca(lcert) ;  
    //need to call before the 
    unsigned long lKeyusage= lCert->ex_kusage; 
+0

方法2では、ex_kusageとex_xkusageが設定されており、X509_check_caを呼び出す必要がないことを意味する 'EXFLAG_SET'がある場合、' ex_flags'の値をチェックする必要があります。 'v3_purp.c '詳細については – bikram990

0

、ライン2365、のOpenSSL 1.0.2d V:

/* This call populates extension flags (ex_flags) */ 

X509_check_purpose(x, -1, 0); 

だから、OpenSSLの開発者は、この方法を使用します。

深く掘削すると、ロックによって保護されたフラグに値を設定するx509v3_cache_extensionsというコールが見つかることがあります。

関連する問題