2

Вопрос по certificate, ssl-certificate, x509, x509certificate, openssl – как получить значение Keyusage из сертификата X509?

Я хочу получить значение использования ключа из структурированного сертификата 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.

  • Этот код распечатывает использование ключа только в читаемом формате.

    от Balamurugan
  • В методе 2 вы должны проверить значениеex_flags если это имеетEXFLAG_SET это означаетex_kusage а такжеex_xkusage установлены, и вам не нужно звонитьX509_check_ca, ты можешь проверитьv3_purp.c Больше подробностей

    от
  • Я отвечаю в этой теме возможное решение:stackoverflow.com/questions/9991147/…

    от Rafael Gorski
  • 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:

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

  • 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Заселенные флаги, охраняемые замками.

  • 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);
    
    ...
    

    В моем случае для сертификата teste было напечатано: «Цифровая подпись, безотказность, шифрование ключей».

    Есть и другие способы, такие как использование ASN1_BIT_STRING *. Я могу показать вам, если вышеперечисленное не соответствует вашим потребностям.

    С уважением.