28.02.2007 14:51:43Еще раз про CertFindCertificateInStore() Ответов: 7
Денис
Посмотрел форум по ссылке
http://www.cryptopro.ru/CryptoPro/forum/view.asp?q=3221
и все равно у меня функция дает ошибку "Cannot find object or property."
Мой сертификат:
-----BEGIN CERTIFICATE-----
MIIDoTCCA06gAwIBAgIKcdwNCAABAAAdJDAKBgYqhQMCAgMFADBlMSAwHgYJKoZI
hvcNAQkBFhFpbmZvQGNyeXB0b3Byby5ydTELMAkGA1UEBhMCUlUxEzARBgNVBAoT
CkNSWVBUTy1QUk8xHzAdBgNVBAMTFlRlc3QgQ2VudGVyIENSWVBUTy1QUk8wHhcN
MDYxMjE5MDgxNzU2WhcNMDcxMjE5MDgyNzU2WjBeMR8wHQYJKoZIhvcNAQkBFhBh
ZG1pbkBydWNhcmQubmV0MQswCQYDVQQGEwJSVTEPMA0GA1UEBxMGTU9TQ09XMR0w
GwYDVQQDDBRSVUNBUkRfQkVFUEFZWFBfVEVTVDCBpTAcBgYqhQMCAhQwEgYHKoUD
AgIgAgYHKoUDAgIeAQOBhAAEgYD9dH9iNYQHx0Fk3cnDF8Dd6fdGoGG1zfJ2SHY6
Ojn5HMlikHnyIKDC4QFYZvR93wAFZHMlhhG6vlqE+JxkthvWcYJggMSly4u22euT
W+PnPL8jnun9FRLRwVhtv/EffdkTkOHEEVl3c0N6Q7ksWBXRjjor9WxVxUuKwLIN
0iPIVqOCAZ4wggGaMA4GA1UdDwEB/wQEAwIGwDAdBgNVHQ4EFgQUg+nTTfqqm0ac
RMZVXAQgrxm/N9UwEwYDVR0lBAwwCgYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUSFUw
GMs8IqkX12JiZAWnpMyGihEwUgYDVR0fBEswSTBHoEWgQ4ZBaHR0cDovL3d3dy5j
cnlwdG9wcm8ucnUvY2VydGVucm9sbC9UZXN0JTIwQ2VudGVyJTIwQ1JZUFRPLVBS
Ty5jcmwwgd4GCCsGAQUFBwEBBIHRMIHOMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3
LmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NyeXB0by5jcnlwdG9wcm8ucnVfVGVz
dCUyMENlbnRlciUyMENSWVBUTy1QUk8oMSkuY3J0MDEGCCsGAQUFBzABhiVodHRw
Oi8vd3d3LmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMDMGCCsGAQUFBzABhido
dHRwOi8vd3d3LmNyeXB0b3Byby5ydS9vY3NwbmMvb2NzcC5zcmYwCgYGKoUDAgID
BQADQQAC0CLWw+j8FQn5T/e2Axh0BiGjTF9K2hEGeFSl9I7c0VsQOL/n6rCIA9dG
J9gG3FbRUccu69keOWCZnopWT9v5
-----END CERTIFICATE-----

Кусок кода:
#define MY_CERT_ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)
#define MY_NAME_ENCODING (CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG)

__func = "CheckSign::CertStrToName(NULL)";
DWORD dwNameLen = 0;
if(!CertStrToName(MY_CERT_ENCODING, certName.c_str(), MY_NAME_ENCODING, NULL, NULL, &dwNameLen, NULL))
ThrowLastErrorString(__func.c_str());
printf("%s %s\r\n", __func.c_str(), "done.");
__func = "CheckSign::CertStrToName(name)";
BYTE *name = (BYTE *)alloca(dwNameLen+1);
if(!CertStrToName(MY_CERT_ENCODING, certName.c_str(), MY_NAME_ENCODING, NULL, name, &dwNameLen, NULL))
ThrowLastErrorString(__func.c_str());
printf("%s %s\r\n", __func.c_str(), "done.");
name[dwNameLen] = 0;
__func = "CheckSign::CertFindCertificateInStore()";
CERT_NAME_BLOB cn;
cn.pbData = name;
cn.cbData = dwNameLen;
phCert = CertFindCertificateInStore(hCertStore, MY_CERT_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &cn, NULL);
if(!phCert) ThrowLastErrorString(__func.c_str());
printf("%s %s\r\n", __func.c_str(), "done.");
 
Ответы:
28.02.2007 15:26:50Kirill Sobolev
А certName откуда берется?
28.02.2007 16:47:10Денис
string certName = "CN=RUCARD_BEEPAYXP_TEST, L=MOSCOW, C=RU, E=admin@rucard.net";

на всякий случай:
string __func;
28.02.2007 16:53:32Денис
архив тестового проекта на VS 2003 C++:
http://www2.pay.rucard.net/denisp/pictures/CAPI_TST.ZIP
28.02.2007 17:49:39Kirill Sobolev
Добавьте к MY_NAME_ENCODING флаг CERT_NAME_STR_REVERSE_FLAG.
01.03.2007 8:58:01Денис
не помогло...
01.03.2007 9:37:51Денис
При необходимости я могу и контейнер ключа выгрузить, все равно тестовый...
01.03.2007 12:01:41Денис
Заработало!
Второй параметр функции CertOpenStore (флаг кодирования) у меня был 0, а нужен был (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING).