2012-02-29 102 views
4

我目前使用CertGetNameString提取每個主題屬性的值,像這樣的證書在:提取主題屬性的所有值

CertGetNameString(pCertificate, 
        CERT_NAME_ATTR_TYPE, 
        0, 
        szOID_ORGANIZATIONAL_UNIT_NAME, 
        buf, 
        _countof(buf)); 

然而,一些證書我發現對組織多個值單位名稱(OU)和CertGetNameString只能讀取第一個。舉例來說,這是一個Adobe證書的主題:

CN = Adobe Systems, Incorporated 
OU = Acrobat Engineering 
OU = Digital ID Class 3 - Microsoft Software Validation v2 
O = Adobe Systems, Incorporated 
L = San Jose 
S = California 
C = US 

我如何可以讀取所有值使用的CryptoAPI的OU(及其他)屬性(S)?

回答

11

好的,找到了解決方案。正確的API來使用是CertNameToStr,就像這樣:

CertNameToStr(X509_ASN_ENCODING, 
        &pCertificate->pCertInfo->Subject, 
        CERT_X500_NAME_STR, 
        buf, 
        _countof(buf)); 

它會返回一個字符串,如:

C=US, S=California, L=San Jose, O="Adobe Systems, Incorporated", OU=Digital ID Class 3 - Microsoft Software Validation v2, OU=Acrobat Engineering, CN="Adobe Systems, Incorporated" 

如果需要單獨的屬性值,然後可以解析。