Cryptography 如何使用CryptoAPI加载具有unicode CN的证书?
我正在尝试从系统存储加载证书。我正在使用CryptoAPI中的函数Cryptography 如何使用CryptoAPI加载具有unicode CN的证书?,cryptography,cryptoapi,pfx,Cryptography,Cryptoapi,Pfx,我正在尝试从系统存储加载证书。我正在使用CryptoAPI中的函数CertFindCertificateInstaller: 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.p
CertFindCertificateInstaller
:
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);
CERT\u RDN\u ATTR
的dwValueType设置为CERT\u RDN\u PRINTABLE\u STRING
,而不是CERT\u RDN\u UNICODE\u STRING
?(我正在使用Unicode。)对于CERT\u RDN\u Unicode\u字符串
此代码不起作用用这种方式加载带有unicode名称的证书,我能做些什么呢?如果你能从MSDN文档的乱七八糟中理解任何东西,那你就太棒了。也许可以解构以下gem以获得一些启发: CERT_UNICODE_IS_RDN_ATTRS_标志dwFindFlags值仅用于 的证书查找主题属性和证书查找颁发者属性值 dwFindType。如果 pvFindPara指向的CERT_RDN_ATTR结构已用初始化 Unicode字符串。在进行任何比较之前,要 通过使用X509_UNICODE_名称转换匹配,以提供UNICODE 比较
我猜“要匹配的字符串”在
subccn.Value.pbData
字段中。您是否已使用X509\u UNICODE\u NAME
转换此文件?这似乎是您在函数中执行的操作。去那一页让我头疼。很抱歉,接下来的步骤必须由您来完成。我更仔细地查看了文档。据我现在了解,,
证书名称blob包含rdn属性的编码数组
每个rdn属性都有类型,例如UTF8、UNICODE、T.61等
当为CertFindCertificateInstare使用CERT_UNICODE_IS_RDN_ATTRS_标志时,此函数将转换提供的字符串
将RDN属性从Unicode转换为RDN属性类型,然后将此值与证书RDN匹配
所以我用CryptDecodedObject对我的证书进行了解码,查看RDN公共名称,结果发现,该类型是CERT_RDN_T61_字符串。然后我将subjectcn.dwValueType设置为CERT_RDN_T61_字符串代码已经工作。对于俄语符号,我需要CERT_RDN_UNICODE_字符串。
所以,如果您不知道该属性在证书中的确切编码,那么使用CERT\u FIND\u SUBJECT\u ATTR或CERT\u FIND\u ISSUER\u ATTR的CertFindCertificateInstaller对您没有多大用处