logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Евгений Пряхин  
#1 Оставлено : 4 августа 2009 г. 18:31:24(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 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;
}
 



Если для анализа проблемы нужен еще какой-либо код, готов с радостью предоставить.

Может кто сталкивался?
Заранее спасибо.
Offline maxdm  
#2 Оставлено : 4 августа 2009 г. 19:01:20(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
КС1 или КС2?
Secur32.lib удобнее использовать.
Offline Евгений Пряхин  
#3 Оставлено : 4 августа 2009 г. 19:04:51(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Цитата:
КС1 или КС2?

КС2
Цитата:
Secur32.lib удобнее использовать.

Каким образом можно использовать? Почему удобнее?
Offline Евгений Пряхин  
#4 Оставлено : 5 августа 2009 г. 14:11:49(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Есть мысли у кого в чем может быть дело?
Offline maxdm  
#5 Оставлено : 5 августа 2009 г. 15:17:56(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
Secur32.lib эспортирует функции интрефейса SSPI.
В EventLog ошибок не появляется? Советую установить Crypto-Pro Winlogon в качестве патча к SSL, а еще лучше - CSP 3.6.
Offline Евгений Пряхин  
#6 Оставлено : 5 августа 2009 г. 15:44:10(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

В EventLog ошибок нету, впрочем как и каких либо других сообщений связанных с проблемой.
Пробовал использовать вышеуказанную библиотеку в виде подключения ее в качестве DLL - Secur32.dll.
Рельтат - та же ошибка.
Offline Евгений Пряхин  
#7 Оставлено : 5 августа 2009 г. 15:56:05(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

При последних двух запусках в ивент лог записалась ошибка:
КриптоПро TLS. Ошибка 0x6ba при обращении к CSP: Сервер RPC недоступен.
Offline maxdm  
#8 Оставлено : 5 августа 2009 г. 16:22:52(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
Упала служба cprmcsp. Попробуйте использовать KC1, или рекомендации из предыдущего поста.
Offline Евгений Пряхин  
#9 Оставлено : 5 августа 2009 г. 16:29:20(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Спасибо за совет. Попробую для начала на КС1. Отпишу через пару часов орезультатах.
Offline Евгений Пряхин  
#10 Оставлено : 5 августа 2009 г. 17:05:03(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

На КриптоПро 3ю.0 КС1 ошибка воспроизводится.
В ивент логе следующее:
КриптоПро TLS. Ошибка 0x80092004 при обращении к CSP: Объект или свойство не найдено.
Offline maxdm  
#11 Оставлено : 5 августа 2009 г. 18:04:33(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
А сертификат с ключом связан? Попробуйте использовать другой.
Offline Евгений Пряхин  
#12 Оставлено : 5 августа 2009 г. 18:49:48(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Да, связан.

UserPostedImage
С другим ключем пробовал - ситуация повторилась в деталях.
Offline Евгений Пряхин  
#13 Оставлено : 5 августа 2009 г. 19:55:16(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Попробовал на CSP 3.6 КС1 - ошибка та же самая. В инвент логе пусто.

Быть может проблема где-то в коде?

Отредактировано пользователем 5 августа 2009 г. 19:57:47(UTC)  | Причина: Не указана

Offline maxdm  
#14 Оставлено : 5 августа 2009 г. 20:08:13(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
Посмотрите в примерах в SDK к CSP 3.6.
Offline maxdm  
#15 Оставлено : 5 августа 2009 г. 20:13:24(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
err = getCertificateContext(cspHandle, pCertContext); - pCertContext передается по ссылке?
Offline Евгений Пряхин  
#16 Оставлено : 5 августа 2009 г. 20:16:06(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 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;
}
Offline maxdm  
#17 Оставлено : 5 августа 2009 г. 20:34:26(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
В этом коде сертификат не получит ссылки на ключ - проще выбрать сертификат из хранилища.
Offline Евгений Пряхин  
#18 Оставлено : 5 августа 2009 г. 20:36:56(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Так, понял.
Каким образом это можно сделеать если ключи и сертификат лежат на eToken"е?
Offline maxdm  
#19 Оставлено : 5 августа 2009 г. 20:38:54(UTC)
maxdm


Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 4,816
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 11 раз
Поблагодарили: 407 раз в 370 постах
Можно установить контексту Property CRYPT_KEY_PROV_INFO
Offline Евгений Пряхин  
#20 Оставлено : 5 августа 2009 г. 20:49:17(UTC)
Евгений Пряхин

Статус: Участник

Группы: Участники
Зарегистрирован: 06.05.2009(UTC)
Сообщений: 28
Откуда: Москва

Это с помощью CryptSetProvParam ?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.