С++: получить альтернативное имя субъекта из сертификата x509v3

Я пытаюсь разобрать сертификат x509v3. Я собрал воедино, как получить все необходимые мне части, кроме поля URI в альтернативном имени субъекта. У меня есть следующий код. Когда я меняю поля альтернативного имени субъекта в файле конфигурации, который я использую для создания своих тестовых сертификатов, я вижу соответствующие изменения в выводе count, SA и Type, поэтому кажется, что он читается в нужной области для SA URI. Однако мой вывод SA всегда выходит как «1», поэтому он не кажется правильным членом структуры, поскольку у меня есть имя в моем поле URI.

Из вывода текста сертификата (через команду openssl):

X509v3 Subject Alternative Name: 
URI:ThisIsTheUri, email:[email protected]

Код:

GENERAL_NAMES* subjectAltNames =
               (GENERAL_NAMES*)X509_get_ext_d2i(&certificate, NID_subject_alt_name, NULL, NULL);

boost::int32_t altNameCount = sk_GENERAL_NAME_num(subjectAltNames);
std::cout << "Alt Name Count: " << altNameCount << "." << std::endl;
for (boost::int32_t i = 0; i < altNameCount; ++i)
{
  GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
  if (generalName->type == GEN_URI)
  {
    subjectAltName = std::string(reinterpret_cast<char*>(generalName->d.ia5->data));
    // subjectAltName should be "ThisIsTheUri", but is "1".
    std::cout << "SA: '" << subjectAltName << "'." << std::endl;
  }
  else
  {
    std::cout << "Type: '" << generalName->type << "'." << std::endl;
  }
}

person user1667153    schedule 31.10.2012    source источник
comment
Остерегайтесь потенциального разыменования нулевого указателя. sk_GENERAL_NAME_value() вызывает sk_value, который может вернуть NULL. Однако ваш указатель generalName не проверяется на NULL перед разыменованием.   -  person scai    schedule 10.01.2020


Ответы (1)


Хитрость заключается в использовании ASN1_STRING_data() и ASN1_STRING_length() для извлечения строки ia5:

std::string(reinterpret_cast<char*>(ASN1_STRING_data(generalName->d.uniformResourceIdentifier)),
            ASN1_STRING_length(generalName->d.uniformResourceIdentifier));
person user1667153    schedule 01.11.2012