2011-09-14 10 views
1

システムストアから証明書をロードしようとしています。私はCryptoAPIの機能からCertFindCertificateInStoreを使用しています:CryptoAPIを使用してユニコードCNで証明書をロードするにはどうすればよいですか?

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); 
  1. なぜ私はCERT_RDN_PRINTABLE_STRING代わりのCERT_RDN_UNICODE_STRINGCERT_RDN_ATTRためdwValueTypeを設定する必要がありますか? (私はUnicodeを使用しています)CERT_RDN_UNICODE_STRINGでこのコードは機能しません。

  2. しかし、空白とロシアのシンボルを含む件名CNを証明書に読み込むことはできません。 "foo"のような単純なCN名の場合、このコードは完璧に動作します。

このようにユニコード名で証明書を読み込むにはどうすればよいですか?

答えて

1

MSDNのマニュアルがぎこちないものから理解できれば、あなたはすばらしいです。恐らく次のGEMは、いくつかの照明のために解体することができる。

CERT_UNICODE_IS_RDN_ATTRS_FLAG dwFindFlags値のみ dwFindTypeためCERT_FIND_SUBJECT_ATTRとCERT_FIND_ISSUER_ATTR値で使用されています。 pertFieldParによって指される CERT_RDN_ATTR構造体が ユニコード文字列で初期化された場合は、CERT_UNICODE_IS_RDN_ATTRS_FLAGを設定する必要があります。比較が行われる前に、 と一致する文字列は、X509_UNICODE_NAMEを使用してUnicode の比較を提供するように変換されます。

「一致する文字列」はsubjCN.Value.pbDataフィールドにあると思います。 X509_UNICODE_NAMEを使用してこれを変換しましたか?これは、CryptEncodeObject関数でやっているようです。そのページに行くと頭が痛くなりました。申し訳ありませんが、あなたは次のステップに苦しむ人でなければなりません。

1

もっと慎重にドキュメントを参照しました。などUTF8、UNICODE、T.61およびなどCertFindCertificateInStoreためCERT_UNICODE_IS_RDN_ATTRS_FLAGを使用している場合

、この関数はsuppled変換し - 私は今理解しているように、 証明書の名前のブロブは、RDNのエンコードされた配列は、それぞれのRDN属性のタイプがあります http://msdn.microsoft.com/en-us/library/aa382005(v=vs.85).aspx 属性が含まれてい文字列 (RDN属性のUnicodeからRDNへのアトリビュートタイプ)。次に、この値を証明書RDNと照合します。

私は証明書をCryptDecodedObjectでデコードし、RDNコモンネームを見ました。そのタイプはCERT_RDN_T61_STRINGでした。次に、subjCN.dwValueTypeをCERT_RDN_T61_STRINGコードに設定しました。ロシアのシンボルについては、CERT_RDN_UNICODE_STRINGが必要でした。 CERT_FIND_SUBJECT_ATTRまたはCERT_FIND_ISSUER_ATTRを使用したCertFindCertificateInStoreは、証明書のこの属性の正確なエンコードを知らない場合はあまり役に立ちません。

関連する問題