| 
	Статус: Участник
 Группы: Участники
Зарегистрирован: 23.09.2011(UTC)
 Сообщений: 17
 
 | 
            
		      
                Ubuntu 12.04 Сначало я получаю список всех контейнеров у которых есть закрытый ключ и есть сертификат ему соответсвующий, затем я сохраняю сертификат в виде байтового массива Код:
HCRYPTPROV enumerationProvider = 0;
CryptAcquireContext(&enumerationProvider, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT);
DWORD containerNameSize = 1024;
String containerNameLocal;
containerNameLocal.resize(containerNameSize);
if (CryptGetProvParam(enumerationProvider, PP_ENUMCONTAINERS, (BYTE*)containerNameLocal.data(), &containerNameSize, CRYPT_FIRST))
{
	WString alias;
	KeyInfo info;
	do
	{
		containerNameLocal.resize(containerNameSize);
		HCRYPTPROV containerProvider = 0;
		if(!CryptAcquireContextA(&containerProvider, containerNameLocal.c_str(), 0, PROV_GOST_2001_DH, 0))
		{
			continue;
		}
		HCRYPTKEY key = 0;
		if (!CryptGetUserKey(containerProvider, AT_SIGNATURE, &key))
		{
			CryptReleaseContext(containerProvider, 0);
			continue;
		}
		DWORD certificateSize = 0;
		if (!CryptGetKeyParam(key, KP_CERTIFICATE, 0, &certificateSize, 0))
		{
			CryptDestroyKey(key);
			CryptReleaseContext(containerProvider, 0);
			continue;
		}
		KeyInfo info;
		info.alias = getName(containerProvider, PP_CONTAINER);
		ByteArray certificate(certificateSize);
		poco_assert(CryptGetKeyParam(key, KP_CERTIFICATE, (BYTE*)certificate.data(), &certificateSize, 0));
		certificate.resize(certificateSize);
		info.certificate = certificate;
		CryptDestroyKey(key);
		CryptReleaseContext(containerProvider, 0);
		containerNameSize = 1024;
		containerNameLocal.resize(containerNameSize);
	} while(CryptGetProvParam(enumerationProvider, PP_ENUMCONTAINERS, (BYTE*)containerNameLocal.data(), &containerNameSize, CRYPT_NEXT));
}
CryptReleaseContext(enumerationProvider, 0);
 После этого где то в другом месте происходит попытка получить контекс провайдера для закрытого ключа по его сертификату Код:
_provider = 0;
_keySpec = AT_SIGNATURE;
_isNeedCleenup = TRUE;
PCERT_CONTEXT _certificate = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, (BYTE*)certificate.data(), (DWORD)certificate.size());
CryptAcquireCertificatePrivateKey(_certificate, CRYPT_SILENT, 0, &_provider, &_keySpec, &_isNeedCleenup);
 CryptAcquireCertificatePrivateKey возвращает 0, GetLastError возвращает 0x80090020 Я знаю, что для Windows этот код работает только если установить личный сертификат из контейнера, но даже без установленного сертификата на Windows код ошибки возвращался более осмысленный. Скажите пожалуйста где я не прав и/или что мне нужно сделать что бы это заработало. Отредактировано пользователем 16 января 2013 г. 15:00:29(UTC)
 | Причина: Не указана |