2011-09-14 4 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을 설정해야합니까? (유니 코드를 사용하고 있습니다.) CERT_RDN_UNICODE_STRING으로이 코드는 작동하지 않습니다.

  2. 그럼에도 불구하고 공백 및 러시아 기호가 포함 된 제목 CN을 인증서에로드 할 수 없습니다. "foo"와 같은 간단한 CN 이름의 경우이 코드가 완벽하게 작동합니다.

이런 식으로 유니 코드 이름으로 인증서를로드하려면 어떻게해야합니까?

답변

1

당신이 MSDN 문서 인 횡설수설에서 무엇인가를 이해할 수 있다면 당신은 훌륭합니다. dwFindType 대한 CERT_FIND_SUBJECT_ATTR 및 CERT_FIND_ISSUER_ATTR 값

CERT_UNICODE_IS_RDN_ATTRS_FLAG dwFindFlags 값은 함께 사용된다 : 아마도 다음 일품 몇몇 조명을 위해 해체 될 수있다. pertFoundPara가 가리키는 CERT_RDN_ATTR 구조체가 유니 코드 문자열로 초기화 된 경우 CERT_UNICODE_IS_RDN_ATTRS_FLAG를 설정해야합니다. 비교가 이루어지기 전에 과 일치하는 문자열은 유니 코드 비교를 제공하기 위해 X509_UNICODE_NAME을 사용하여 변환됩니다.

"일치하는 문자열"은 subjCN.Value.pbData 필드에 있습니다. X509_UNICODE_NAME을 사용하여 이것을 변환 했습니까? 이것은 CryptEncodeObject 함수에서하는 것처럼 보입니다. 그 페이지로 가면 머리가 아파요. 죄송합니다. 다음 단계를 통해 고난을 겪어야합니다.

1

더 자세히 살펴 보았습니다. 등 UTF8, 유니 코드, 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으로 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는 인증서에서이 속성의 정확한 encodyng을 모르는 경우별로 유용하지 않습니다.