Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|