| ||||
| ||||
Посмотрел форум по ссылке 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."); | ||||
Ответы: | ||||
| ||||
А certName откуда берется? | ||||
| ||||
string certName = "CN=RUCARD_BEEPAYXP_TEST, L=MOSCOW, C=RU, E=admin@rucard.net"; на всякий случай: string __func; | ||||
| ||||
архив тестового проекта на VS 2003 C++: http://www2.pay.rucard.net/denisp/pictures/CAPI_TST.ZIP | ||||
| ||||
Добавьте к MY_NAME_ENCODING флаг CERT_NAME_STR_REVERSE_FLAG. | ||||
| ||||
не помогло... | ||||
| ||||
При необходимости я могу и контейнер ключа выгрузить, все равно тестовый... | ||||
| ||||
Заработало! Второй параметр функции CertOpenStore (флаг кодирования) у меня был 0, а нужен был (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING). | ||||