1

システム ストアから証明書を読み込もうとしています。CertFindCertificateInStoreCryptoAPIの関数を使用しています。

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. の代わりにの dwValueTypeCERT_RDN_ATTRを設定する必要があるのはなぜですか? (私は Unicode を使用しています。)このコードでは動作しません。CERT_RDN_PRINTABLE_STRINGCERT_RDN_UNICODE_STRINGCERT_RDN_UNICODE_STRING

  2. それにもかかわらず、空白とロシア語の記号を含むサブジェクト CN を持つ証明書をロードできません。「foo」などの単純な CN 名の場合、このコードは完璧に機能します。

この方法でユニコード名の証明書をロードするにはどうすればよいですか?

4

2 に答える 2

1

MSDNのドキュメントであるジブリッシュから何かを理解できるなら、あなたは驚くべきことです。おそらく、次の宝石は、いくつかの照明のために分解することができます:

CERT_UNICODE_IS_RDN_ATTRS_FLAG dwFindFlags値は、dwFindTypeのCERT_FIND_SUBJECT_ATTRおよびCERT_FIND_ISSUER_ATTR値でのみ使用されます。pvFindParaが指すCERT_RDN_ATTR構造がUnicode文字列で初期化されている場合は、CERT_UNICODE_IS_RDN_ATTRS_FLAGを設定する必要があります。比較が行われる前に、一致する文字列がX509_UNICODE_NAMEを使用して変換され、Unicode比較が提供されます。

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

于 2011-09-15T01:13:56.167 に答える
1

私はより注意深くドキュメントを調べました。私が今理解しているように、証明書名のブロブには、rdn 属性のエンコードされた配列が含まれています http://msdn.microsoft.com/en-us/library/aa382005(v=vs.85).aspx 各 rdn 属性には、UTF8 などの型があります。 UNICODE、T.61など

CertFindCertificateInStore に CERT_UNICODE_IS_RDN_ATTRS_FLAG を使用する場合、この関数は RDN 属性の提供された文字列を Unicode から RDN 属性タイプに変換し、この値を証明書 RDN と照合します。

そこで、証明書を CryptDecodedObject でデコードし、RDN Common Name ant を調べたところ、そのタイプは CERT_RDN_T61_STRING でした。次に、subjCN.dwValueType を CERT_RDN_T61_STRING に設定しました。コードは機能していました。ロシア語の記号には CERT_RDN_UNICODE_STRING が必要でした。したがって、証明書内のこの属性の正確なエンコードがわからない場合、CERT_FIND_SUBJECT_ATTR または CERT_FIND_ISSUER_ATTR を使用した CertFindCertificateInStore はあまり役に立ちません。

于 2011-09-15T06:46:39.980 に答える