2

X509 構造化証明書からキー使用法値を取得したいので、次のコードを試しました

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

lKeyusage の値を出力すると、128 になることもあります。同じ証明書に対して 0 になることもあります。エラーの原因を教えてください。私が間違っている場合は、サンプルコードまたは正しいAPIを教えてください..

4

3 に答える 3

8

最も簡単な方法は、メモリ 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);

...

私の場合、teste証明書の場合、「デジタル署名、否認防止、鍵暗号化」が印刷されています

ASN1_BIT_STRING * を使用するなど、他の方法もあります。上記がお客様のニーズに合わない場合は、お見せできます。

よろしく。

于 2012-04-13T15:24:18.943 に答える
3

以下のコードを使用して、キーの使用法値を取得しました。方法 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:

     X509_check_ca(lcert) ;       
     //need to call before the 
     unsigned long lKeyusage= lCert->ex_kusage;
于 2012-04-16T11:00:45.350 に答える
0

ssl\ssl_lib.c、行 2365、OpenSSL v 1.0.2d から:

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

X509_check_purpose(x, -1, 0);

したがって、OpenSSL 開発者はこの方法を使用します。

x509v3_cache_extensionsより深く掘り下げると、ロックによって保護されたフラグを設定するの呼び出しが見つかる場合があります。

于 2015-08-10T00:59:33.850 に答える