我正在尝试从系统存储加载证书。我正在使用CertFindCertificateInStore
CryptoAPI 中的函数:
std::string certName;
CERT_RDN_ATTR subjCN;
subjCN.pszObjId = szOID_COMMON_NAME;
subjCN.dwValueType = CERT_RDN_PRINTABLE_STRING;
subjCN.Value.cbData = 2*(certName.size());
subjCN.Value.pbData = (BYTE*)certName.c_str();
CERT_RDN rdn;
rdn.cRDNAttr = 1;
rdn.rgRDNAttr = &subjCN;
cert = CertFindCertificateInStore ( certStore,
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
CERT_UNICODE_IS_RDN_ATTRS_FLAG ,
CERT_FIND_SUBJECT_ATTR,
&rdn,
NULL);
为什么我需要将 dwValueType 设置为
CERT_RDN_ATTR
toCERT_RDN_PRINTABLE_STRING
而不是CERT_RDN_UNICODE_STRING
?(我使用的是 Unicode。)使用CERT_RDN_UNICODE_STRING
此代码不起作用。不过,我无法使用包含空格和俄语符号的主题 CN 加载证书。对于简单的 CN 名称,例如“foo”,此代码完美运行。
我该怎么做才能以这种方式加载具有 unicode 名称的证书?