Как извлечь IP-адрес из поля subject_alt_name из сертификатов OpenSSL, используя API (не команды openssl) в C - PullRequest
0 голосов
/ 10 июня 2019

Мое требование - извлечь IP-адрес из сертификатов openSSL, используя функции API OpenSSL (не примитивные команды openSSL).Я могу использовать ASN1_STRING_data () для извлечения сведений о поле san, но как мне распечатать IP-адрес из него. Каков тип данных поля IP-адреса

Я получаю общее имя и поле san из сертификатов, следующихприведенный ниже поток кода. Я могу получить общее имя, но у меня возникли проблемы с полем SAN

Используя openssl api для C, я смог получить поле общего имени, но не поле ip SAN

common_name(X509* server_cert) 
{


   X509_NAME *subject_name = X509_get_subject_name((X509 *)server_cert);

int common_name_loc = X509_NAME_get_index_by_NID(subject_name, NID_commonName, -1);

  X509_NAME_ENTRY *common_name_entry = 
X509_NAME_get_entry(X509_get_subject_name((X509 *) server_cert), common_name_loc);

ASN1_STRING *common_name_asn1 = X509_NAME_ENTRY_get_data(common_name_entry);        

char *common_name_str = (char *) ASN1_STRING_data(common_name_asn1);
}



san_field(X509 *cert)
{

    STACK_OF(GENERAL_NAME) *san_names = NULL;
    // Try to extract the names within the SAN extension from the certificate
san_names = static_cast<STACK_OF(GENERAL_NAME)*>(X509_get_ext_d2i((X509 *)cert, NID_subject_alt_name, NULL, NULL));

    san_names_nb = sk_GENERAL_NAME_num(san_names);
    // Check each name within the extension
    for (i=0; i<san_names_nb; i++) 
{
       const GENERAL_NAME *current_name = sk_GENERAL_NAME_value(san_names, i);
    if (current_name->type == GEN_IPADD)
    {
    const char* ip_addrezz = reinterpret_cast<char*> 
        (ASN1_STRING_data(current_name->d.iPAddress));

        print ---------->ip_addrezz //issue here

    }
}   
}

How to extract SAN ip field from certificate
How to print the ip address extracted from SAN field of certificate/what is the data type of the ip field
Am i going in correct direction
...