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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline altazar  
#1 Оставлено : 14 сентября 2011 г. 14:42:30(UTC)
altazar

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

Группы: Участники
Зарегистрирован: 13.01.2011(UTC)
Сообщений: 16

Входящие:
Windows XP SP3
КриптоПро CSP:
Версия ядра СКЗИ 3.6.5359 КС1
Версия продукта 3.6.6497
Алгоритм работы:
1) Есть токен с контейнером закрытого ключа сертификат на токене в личном хранилище сертификатов в Windows ничего нет,
Нижеприведенный алгоритм работает нормально.

2) Ставим сертификат в личное хранилище (без привязки к закрытому ключу средствами Windows) и удаляем его оттуда через консоль с оснасткой сертификатов.
3) Шифруем для этого получателя (сертификата) некий файл
PCCERT_CONTEXT RecipientCertArray[1];
DWORD EncryptAlgSize;
CRYPT_ALGORITHM_IDENTIFIER EncryptAlgorithm;
CRYPT_ENCRYPT_MESSAGE_PARA EncryptParams;
DWORD EncryptParamsSize;
BYTE* pbEncryptedBlob;
DWORD cbEncryptedBlob;

RecipientCertArray[0] = pCertContext;
EncryptAlgSize = sizeof(EncryptAlgorithm);
memset(&EncryptAlgorithm, 0, EncryptAlgSize);
EncryptAlgorithm.pszObjId = OID_CipherVar_Default;

EncryptParamsSize = sizeof(EncryptParams);
memset(&EncryptParams, 0, EncryptParamsSize);
EncryptParams.cbSize = EncryptParamsSize;
EncryptParams.dwMsgEncodingType = MY_ENCODING_TYPE;
EncryptParams.hCryptProv = hCryptProv;
EncryptParams.ContentEncryptionAlgorithm = EncryptAlgorithm;
printf("Encrypting...\n");
if(!CryptEncryptMessage(
&EncryptParams,
1,
RecipientCertArray,
pbContent,
cbContent,
NULL,
&cbEncryptedBlob))
....

2) пытаемся расшифровать
a) Для этого создаем хранилище сертификатов в памяти
HANDLE hStore = CertOpenStore(
CERT_STORE_PROV_MEMORY,
MY_ENCODING_TYPE,
hCryptProv,
0,
NULL);

b) Получаем контекст сертификата с токена, связываем с закрытым ключом и добавляем в наше временное хранилище
HCRYPTPROV hCP;

if(!CryptAcquireContext(
&hCP,
containerName,
NULL,
75,
0))
{
return FALSE;
}
HCRYPTKEY hKey = NULL;
CryptGetUserKey(hCP, AT_SIGNATURE, &hKey);
if(hKey==NULL)
CryptGetUserKey(hCP, AT_KEYEXCHANGE, &hKey);

if(hKey==NULL)
{
CryptReleaseContext(hCP, 0);
return FALSE;
}

DWORD certSize = 0;
BYTE *pCert;
if(!CryptGetKeyParam(hKey, KP_CERTIFICATE, NULL, &certSize, NULL))
{
CryptReleaseContext(hCP, 0);
return TRUE;
}

pCert = (BYTE *)malloc(certSize);
if(!CryptGetKeyParam(hKey, KP_CERTIFICATE, pCert, &certSize, NULL))
{
CryptReleaseContext(hCP, 0);
return TRUE;
}
PCCERT_CONTEXT pCertContext = CertCreateCertificateContext(MY_ENCODING_TYPE, pCert, certSize);
CRYPT_KEY_PROV_INFO provInfo;
ZeroMemory(&provInfo, sizeof(CRYPT_KEY_PROV_INFO));
provInfo.dwProvType = 75;
provInfo.pwszContainerName = containerName;
provInfo.pwszProvName=L"Crypto-Pro GOST R 34.10-94 Cryptographic Service Provider";

if(!CertSetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &provInfo))
{
CryptReleaseContext(hCP, 0);
return FALSE;
}

if(!CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, NULL))
{
CryptReleaseContext(hCP, 0);
return FALSE;
}
CertFreeCertificateContext(pCertContext);

free(pCert);

с) Далее пытаемся расшифровать
HCERTSTORE CertStoreArray[] = {hStoreHandle};
CRYPT_DECRYPT_MESSAGE_PARA DecryptParams;
DWORD DecryptParamsSize = sizeof(DecryptParams);
ZeroMemory(&DecryptParams, DecryptParamsSize);

DecryptParams.cbSize = DecryptParamsSize;
DecryptParams.dwMsgAndCertEncodingType = MY_ENCODING_TYPE;
DecryptParams.cCertStore = 1;
DecryptParams.rghCertStore = CertStoreArray;
BYTE *pDecBuffer = NULL;
DWORD sizeDec = 0;


if(CryptDecryptMessage(
&DecryptParams,
pEncBuffer,
sizeEnc,
NULL,
&sizeDec,
NULL))
{
...
Получаем размер расшифрованных данных

и после
if(CryptDecryptMessage(
&DecryptParams,
pEncBuffer,
sizeEnc,
pDecBuffer,
&sizeDec,
NULL))
{
}

Ошибку 0x000057
Лечиться повторной установкой в личное хранилище Windows средствами КриптоПРО и удалением сертификата.
Это некая фича системы или я что-то не так делаю?
Спрашиваю не из праздного интереса, будет использоваться в крупной промышленной среде с поддержкой локальных админов,
хотелось бы избежать данной ситуации.


Offline Максим Коллегин  
#2 Оставлено : 14 сентября 2011 г. 15:27:02(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
А зачем пункт 2)?
Знания в базе знаний, поддержка в техподдержке
Offline altazar  
#3 Оставлено : 14 сентября 2011 г. 15:34:08(UTC)
altazar

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

Группы: Участники
Зарегистрирован: 13.01.2011(UTC)
Сообщений: 16

Я увидел эту проблему в процессе работы, теоретически ситуация может возникнуть в промышленной среде
какой-нить умник решит поставить сертификат в MY без привязки и хотелось бы как-то застраховаться.
Я так понимаю проблема в том, что тянется в процесс некая ссылка(типа наличие закрытого ключа) которая остается даже после удаления сертификата из личных
Offline altazar  
#4 Оставлено : 14 сентября 2011 г. 15:37:06(UTC)
altazar

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

Группы: Участники
Зарегистрирован: 13.01.2011(UTC)
Сообщений: 16

Ну и собственно, почему какие-то моменты работы с хранилищем MY влияют на аглоритм, который вообще не использует данное хранилище
Offline Максим Коллегин  
#5 Оставлено : 14 сентября 2011 г. 17:57:24(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Ссылка называется key identifier.
Должно помочь удаление:
Если Win XP - C:\Documents and Settings\<пользователь под которым работаете>\Application Data\Microsoft\SystemCertificates\My\Keys
Если Win 7 - C:\Users\<пользователь под которым работаете>\AppData\Roaming\Microsoft\SystemCertificates\My\Keys
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.