Cryptography 如何使用CryptoAPI加载具有unicode CN的证书?

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

我正在尝试从系统存储加载证书。我正在使用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.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字符串
    此代码不起作用

  • 然而,我无法加载包含空格和俄文符号的主题CN的证书。对于简单的CN名称,如“foo”,此代码非常适合


  • 用这种方式加载带有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对您没有多大用处