Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Dima_Sun  
#1 Оставлено : 25 января 2010 г. 18:40:26(UTC)
Dima_Sun

Статус: Активный участник

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

Пытаюсь реализовать логику, аналогичную примеру EncryptFile из SDK. В CSP 3.0 работало. При тестировании под Вистой поставили 3.6. В строке
// Получение ключа согласования импортом открытого ключа получателя на закрытом ключе отправителя.
CryptImportKey( hProv, pbKeyBlob, dwBlobLen, hKey, 0, &hAgreeKey)
получаю ошибку 0x80090019 (The keyset is not defined.)

Отличие от EncryptFile в способе получения ключей. Собственный ключ получаем из своего сертификата в локальном хранилище. А открытый ключ противоположной стороны получаем из сертификата, опубликованного в AD.

Вопросы таковы:
1. В чем может быть проблема? Куда копать?
2. Не может ли это быть связано с тем как и откуда получаем ключи?
Offline Dima_Sun  
#2 Оставлено : 27 января 2010 г. 19:02:52(UTC)
Dima_Sun

Статус: Активный участник

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

Попробовал тот же самый код на WinXP + CP3.6. Работает.

Вопрос о том в чем может быть проблема на Vista + CP3.6 в силе.
Offline Максим Коллегин  
#3 Оставлено : 27 января 2010 г. 20:23:53(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
Выложите пример целиком, вместе с ключами (или генерацией ключей) и сертификатом.
Знания в базе знаний, поддержка в техподдержке
Offline Dima_Sun  
#4 Оставлено : 28 января 2010 г. 13:56:05(UTC)
Dima_Sun

Статус: Активный участник

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

Выкладываю код, если явных проблем в нем нет и нужны будут сертификаты - выложу.
Код:

bool Init()
{
	LPCSTR pszCertNameOwn = "sens_mgV0U0f7"; 
	LPCSTR pszCertNameOpposite = "CC.ESTYLE";
	LPCWSTR pszLDAP = L"ldap:///< SID=S-1-5-21-1070260972-889993760-3969510834-3864>?userCertificate";


	// Получение собственного сертификата
	PCCERT_CONTEXT pCertContextOwn(NULL);
	if( HCERTSTORE hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_A, 0, NULL, CERT_STORE_READONLY_FLAG|CERT_SYSTEM_STORE_CURRENT_USER, "MY") )
	{	// Find the certificate by CN.
		pCertContextOwn = CertFindCertificateInStore( hCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, pszCertNameOwn, NULL);
		CertCloseStore(hCertStore, 0);
	}


	// Получение сертификата противоположной стороны
	PCCERT_CONTEXT pCertContextOpp(NULL);
	if ( HCERTSTORE hADCertStore = CertOpenStore(CERT_STORE_PROV_LDAP, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG, pszLDAP) )
	{		// Find the certificate by CN.
			pCertContextOpp = CertFindCertificateInStore( hADCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, pszCertNameOpposite, NULL);
			CertCloseStore(hADCertStore, 0);
	}


	// Получение собственного закрытого ключа
	HCRYPTKEY hOwnPrivate(NULL);
	BOOL fCallerFreeProv(FALSE);
	DWORD dwKeySpec(0);
	HCRYPTPROV hProvider(0);
	BOOL bOk = CryptAcquireCertificatePrivateKey(pCertContextOwn, CRYPT_ACQUIRE_USE_PROV_INFO_FLAG|CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hProvider, &dwKeySpec, &fCallerFreeProv);
	bOk = bOk && CryptGetUserKey(hProvider, dwKeySpec, &hOwnPrivate);


	// Получение открытого ключа противоположной стороны
	HCRYPTKEY hOppPublic(NULL);
	bOk = bOk && CryptImportPublicKeyInfo(hProvider, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, &(pCertContextOpp->pCertInfo->SubjectPublicKeyInfo), &hOppPublic);


	// Генерация ключа согласования
	HCRYPTKEY hAgree(0);
	DWORD nBlobLen(0);
	DWORD nErr(0);
	if ( bOk && (bOk = CryptExportKey( hOppPublic, NULL, PUBLICKEYBLOB, 0, NULL, &nBlobLen)) )
	{
		LPBYTE pBuf = new byte [nBlobLen];
		if ( bOk = CryptExportKey( hOppPublic, NULL, PUBLICKEYBLOB, 0, pBuf, &nBlobLen) )
		{
			if ( bOk = CryptImportKey( hProvider, pBuf, nBlobLen, hOwnPrivate, 0, &hAgree) )
			{
				ALG_ID ke_alg = CALG_PRO_EXPORT; // PRO_EXPORT алгоритм ключа согласования
				bOk = bOk && CryptSetKeyParam( hAgree, KP_ALGID, (LPBYTE)&ke_alg, 0);
			}
			else		
				nErr = GetLastError();
		}
	}


	return !!bOk;
}

Offline Максим Коллегин  
#5 Оставлено : 28 января 2010 г. 15:41:19(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 717 раз в 621 постах
код с виду нормальный. Давайте сертификат и ключ.
Знания в базе знаний, поддержка в техподдержке
Offline Dima_Sun  
#6 Оставлено : 29 января 2010 г. 19:37:19(UTC)
Dima_Sun

Статус: Активный участник

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

Разобрались. Проблема была в параметрах с которыми выписывался сертификат. Сертификаты выписываются нашим приложением автоматически, а для этого в XP и Viste разные механизмы используются.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.