Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Здравствуйте. Столкнулся со следующей проблемой. При вызове AcquireCredentialsHandle получаю ошибку SEC_E_INTERNAL_ERROR. В качестве криптопровайдера использую CryptoPro 3.0. Контейнер с ключами и сертификат находятся на eToken. ОС: WinXP SP3, среда разработки MS VS 2008 SE. Код создания мандатов: Код:
int CreateCredentials(HCRYPTPROV cspHandle, PCredHandle phCreds, SECURITY_STATUS &status) {
TimeStamp tsExpiry;
const DWORD cSupportedAlgs = 0;
ALG_ID rgbSupportedAlgs[16];
PCCERT_CONTEXT pCertContext = NULL;
int err;
err = getCertificateContext(cspHandle, pCertContext);
if (pCertContext == NULL)
goto cleanup;
ZeroMemory(&SchannelCred, sizeof(SchannelCred))
SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
if(pCertContext) {
SchannelCred.cCreds = 1;
SchannelCred.paCred = &pCertContext;
}
SchannelCred.grbitEnabledProtocols = 0
if(cSupportedAlgs) {
SchannelCred.cSupportedAlgs = cSupportedAlgs;
SchannelCred.palgSupportedAlgs = rgbSupportedAlgs;
}
SchannelCred.dwFlags |= SCH_CRED_NO_DEFAULT_CREDS;
SchannelCred.dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION;
status = g_pSSPI->AcquireCredentialsHandleA(
NULL, // Name of principal
UNISP_NAME_A, // Name of package
SECPKG_CRED_OUTBOUND, // Flags indicating use
NULL, // Pointer to logon ID
&SchannelCred, // Package specific data
NULL, // Pointer to GetKey() func
NULL, // Value to pass to GetKey()
phCreds, // (out) Cred Handle
&tsExpiry); // (out) Lifetime (optional)
if(status != SEC_E_OK) {
/*
if (status == SEC_E_INSUFFICIENT_MEMORY)
std::cout << "!" << std::endl;
else if (status == SEC_E_INTERNAL_ERROR)
std::cout << "!!" << std::endl;
else if (status == SEC_E_NO_CREDENTIALS)
std::cout << "!!!" << std::endl;
else if (status == SEC_E_NOT_OWNER)
std::cout << "!!!!" << std::endl;
else if (status == SEC_E_SECPKG_NOT_FOUND)
std::cout << "!!!!!" << std::endl;
else if (status == SEC_E_UNKNOWN_CREDENTIALS)
std::cout << "!!!!!!" << std::endl;
*/
std::cout << "!!!" << GetLastError() << std::endl;
err = ERROR_CREATING_CREDENTIALS;
goto cleanup;
}
err = FUNCTION_SUCCESS;
cleanup:
// Освобождение контекста сертификата. В Schannel уже создана его копия.
if(pCertContext != NULL) {
CertFreeCertificateContext(pCertContext);
}
return err;
}
Если для анализа проблемы нужен еще какой-либо код, готов с радостью предоставить. Может кто сталкивался? Заранее спасибо.
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
КС1 или КС2? Secur32.lib удобнее использовать.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
КС2 Цитата:Secur32.lib удобнее использовать. Каким образом можно использовать? Почему удобнее?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Есть мысли у кого в чем может быть дело?
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
Secur32.lib эспортирует функции интрефейса SSPI. В EventLog ошибок не появляется? Советую установить Crypto-Pro Winlogon в качестве патча к SSL, а еще лучше - CSP 3.6.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
В EventLog ошибок нету, впрочем как и каких либо других сообщений связанных с проблемой. Пробовал использовать вышеуказанную библиотеку в виде подключения ее в качестве DLL - Secur32.dll. Рельтат - та же ошибка.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
При последних двух запусках в ивент лог записалась ошибка: КриптоПро TLS. Ошибка 0x6ba при обращении к CSP: Сервер RPC недоступен.
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
Упала служба cprmcsp. Попробуйте использовать KC1, или рекомендации из предыдущего поста.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Спасибо за совет. Попробую для начала на КС1. Отпишу через пару часов орезультатах.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
На КриптоПро 3ю.0 КС1 ошибка воспроизводится. В ивент логе следующее: КриптоПро TLS. Ошибка 0x80092004 при обращении к CSP: Объект или свойство не найдено.
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
А сертификат с ключом связан? Попробуйте использовать другой.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Да, связан.  С другим ключем пробовал - ситуация повторилась в деталях.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Попробовал на CSP 3.6 КС1 - ошибка та же самая. В инвент логе пусто. Быть может проблема где-то в коде? Отредактировано пользователем 5 августа 2009 г. 19:57:47(UTC)
| Причина: Не указана
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
Посмотрите в примерах в SDK к CSP 3.6.
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
err = getCertificateContext(cspHandle, pCertContext); - pCertContext передается по ссылке?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Да. Код:
int getCertificateContext(HCRYPTPROV cspName, PCCERT_CONTEXT &certContext) {
HCRYPTKEY userKey;
BYTE* certificateData = 0;
DWORD certificateDataLength = 0;
//получим пару ключей
if (!CryptGetUserKey(cspName, AT_KEYEXCHANGE, &userKey))
return ERROR_GETTING_KEY_PAIR;
if (!CryptGetKeyParam(userKey, KP_CERTIFICATE, NULL, &certificateDataLength, 0))
return ERROR_GETTING_CERTIFICATE_DATA_LENGTH;
certificateData = (BYTE*)malloc(certificateDataLength);
if (certificateData == NULL)
return ERROR_MEMORY_ALLOCATION;
if(!CryptGetKeyParam(userKey, KP_CERTIFICATE, certificateData, &certificateDataLength, 0))
return ERROR_GETTING_CERTIFICATE_DATA;
//создадим сертификат из массива байтов
certContext = CertCreateCertificateContext(X509_ASN_ENCODING, certificateData, certificateDataLength);
if (certContext == NULL)
return ERROR_CREATING_CERTIFICATE_CONTEXT;
//TODO: осободить память после malloc
//TODO: освободить память ключа, елси необходимо
return FUNCTION_SUCCESS;
}
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
В этом коде сертификат не получит ссылки на ключ - проще выбрать сертификат из хранилища.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
Так, понял. Каким образом это можно сделеать если ключи и сертификат лежат на eToken"е?
|
|
|
|
 Статус: Сотрудник Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 5,005  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 11 раз Поблагодарили: 440 раз в 402 постах
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 06.05.2009(UTC) Сообщений: 28 Откуда: Москва
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.