2012-10-31 43 views
1

我想解析一個x509v3證書。我已經拼湊在一起如何獲得我需要的所有部分,除了主題替代名稱中的URI字段。我有以下代碼。當我在用於創建我的測試證書的配置文件中更改我的主題alt名稱字段時,我看到了計數,SA和類型輸出的相應更改,因此它似乎正在讀取SA URI的正確區域。然而,我的SA輸出總是以「1」出現,所以它看起來不是正確的結構成員,因爲我在我的URI字段中有一個名稱。C++:從x509v3證書檢索主題ALT名稱

從證書文本輸出(通過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; 
    } 
} 

回答

2

訣竅是用ASN1_STRING_data()和ASN1_STRING_length()以提取IA5串:

std::string(reinterpret_cast<char*>(ASN1_STRING_data(generalName->d.uniformResourceIdentifier)), 
      ASN1_STRING_length(generalName->d.uniformResourceIdentifier)); 
相關問題