提取证书中主题属性的所有值

And*_*son 5 c++ windows winapi certificate cryptoapi

我目前正在使用CertGetNameString提取每个主题属性的值,如下所示:

CertGetNameString(pCertificate,
                  CERT_NAME_ATTR_TYPE,
                  0,
                  szOID_ORGANIZATIONAL_UNIT_NAME,
                  buf,
                  _countof(buf));
Run Code Online (Sandbox Code Playgroud)

但是,我发现的一些证书具有组织单位名称(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
Run Code Online (Sandbox Code Playgroud)

如何使用CryptoAPI读取OU(和其他)属性的所有值?

And*_*son 16

好的,找到了解决方案.正确使用的API是CertNameToStr这样的:

    CertNameToStr(X509_ASN_ENCODING,
                  &pCertificate->pCertInfo->Subject,
                  CERT_X500_NAME_STR,
                  buf,
                  _countof(buf));
Run Code Online (Sandbox Code Playgroud)

它将返回一个字符串,如:

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"
Run Code Online (Sandbox Code Playgroud)

如果需要单个属性值,则可以解析哪个.