Я пытаюсь разобрать сертификат x509v3. Я собрал все, как получить все необходимые мне части, кроме поля URI в альтернативном имени субъекта. У меня есть следующий код. Когда я изменяю свои поля имени альтернативного имени субъекта в файле конфигурации, который я использую для создания своих тестовых сертификатов, я вижу соответствующие изменения в счетчике, SA и выводе Типа, поэтому он, кажется, читает в правильной области для URI SA. Тем не менее, мой вывод 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;
}
}
Хитрость заключается в том, чтобы использовать ASN1_STRING_data () и ASN1_STRING_length () для извлечения строки ia5:
std::string(reinterpret_cast<char*>(ASN1_STRING_data(generalName->d.uniformResourceIdentifier)),
ASN1_STRING_length(generalName->d.uniformResourceIdentifier));
Других решений пока нет …