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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Lenich  
#1 Оставлено : 14 сентября 2010 г. 1:14:23(UTC)
Lenich

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

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

Доброго времени суток.

У меня возникла проблема с данной функцией.
Задача довольно простая: есть ЭЦП (ну пусть на флэшке), есть сертификат. Шифруем сообщение с помощью сертификата (CryptEncryptMessage), отправляем получателю (с этим все хорошо).
Получатель пытается расшифровать. И тут начинаются проблемы..
У получателя: вставлена ЭЦП, установлен подписанный сертификат от нее (в "личные"), ОС - Windows 7 x64

При попытке расшифровать (код на С) (компилится mingw (gcc)):
Код:

#define ENC_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

typedef BOOL WINAPI (*CertSetCertificateContextP)
	(PCCERT_CONTEXT pCertContext,
	DWORD dwPropId,
	DWORD dwFlags,
	const void *pvData); // Сделано, т.к. почему-то линкер не хочет ее нормально находить.. а так работает (что тоже не понятно.. стоит КриптоПро 3.6 RC1, Win 7 x64 Pro (со всеми обновлениями)

.....
        CertSetCertificateContextP CertSetCertificateContextProp;
	HINSTANCE hinstLib = LoadLibrary("Crypt32.dll");
	CertSetCertificateContextProp = (CertSetCertificateContextP)GetProcAddress(hinstLib, "CertSetCertificateContextProperty");
        HCRYPTPROV prov;
        HCRYPTKEY Ekey;
	HCERTSTORE store;
	PCCERT_CONTEXT cert;
	CRYPT_DECRYPT_MESSAGE_PARA  decryptParams;
	CERT_KEY_CONTEXT PrivateKeyInfo;
	BYTE* params;
	BYTE* data;
	DWORD size;
	DWORD cType = AT_KEYEXCHANGE;
	FILE* in;

if (!CryptAcquireContext(&prov,NULL,NULL,75,CRYPT_VERIFYCONTEXT))
{
        HandleError("Unable to Verify Context.",1);
}

if (!CryptGetProvParam(prov,PP_ENUMCONTAINERS,NULL,&size,CRYPT_FIRST))
{
        HandleError("Unable to Gep Prov Param Len",1);
}

 params = (BYTE*) malloc(size);

if (!CryptGetProvParam(prov,PP_ENUMCONTAINERS,params,&size,CRYPT_FIRST))
{
        HandleError("Unable to Gep Prov Param",1);
}

 if (!CryptAcquireContext(&prov,(char*)params,NULL,75,0))
{
        HandleError("Unable to Acquire Context.",1);
}
    
if(!CryptGetUserKey(prov,cType,&Ekey))
{
	HandleError("Unable to Get User Key.",1);
}

store = CertOpenSystemStore(prov,"My");	
if (store == NULL)
{
	HandleError("Can not Open Store, error:",1);
}

in = fopen("fname","rb");
data = malloc(sizeof(BYTE)*4096);
len = (DWORD)fread(data, 1, 4096, in); // Файл гарантированно укладывается в 4096 байт

memset(&decryptParams, 0, sizeof(CRYPT_DECRYPT_MESSAGE_PARA));
decryptParams.cbSize = sizeof(CRYPT_DECRYPT_MESSAGE_PARA);
decryptParams.dwMsgAndCertEncodingType = ENC_TYPE;
decryptParams.cCertStore = 1;
decryptParams.rghCertStore = &store;

if(!CryptDecryptMessage(&decryptParams,data,len,NULL,&cbDecryptedMessage,NULL))
{
	HandleError( "Error getting decrypted message size",1);
}

pbDecryptedMessage = (BYTE*)malloc(cbDecryptedMessage);

if(!CryptDecryptMessage(&decryptParams,data,len,pbDecryptedMessage,&cbDecryptedMessage,NULL))
{
	HandleError("Error decrypting the message",1);
}


При выполнении 2-ого декрипта выпадает с ошибкой. Выясняется, что ошибка CRYPT_E_NO_DECRYPT_CERT
(что в My этот сертификат есть - точно).

Поискав по форуму, обнаружил, что все должно начать работать, если после openstore поставить следующее:
Код:

if (!(cert = CertFindCertificateInStore(store,ENC_TYPE,0,CERT_FIND_ANY,NULL,NULL)))
{
	HandleError("Can not Find Certificate in store",1);
}                   // Что характерно, сертификат он находит. Этот сертификат там один (тоже проверял).

PrivateKeyInfo.hCryptProv = prov;
PrivateKeyInfo.dwKeySpec = AT_KEYEXCHANGE;
PrivateKeyInfo.cbSize = sizeof(PrivateKeyInfo);

if (!CertSetCertificateContextProp(cert, CERT_KEY_CONTEXT_PROP_ID, 0, &PrivateKeyInfo))
{
 	HandleError("Can not Set Certificate Context Prop",1);
}


Но, после этого на том же самом декрипте я получаю ошибку 0x00000057..
Вот к чему она может быть, и как ее лечить - найти не смог..
Offline Kirill Sobolev  
#2 Оставлено : 14 сентября 2010 г. 16:30:29(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
А с помощью csptest можно у получателся расшифровать?
Техническую поддержку оказываем тут
Наша база знаний
Offline Lenich  
#3 Оставлено : 14 сентября 2010 г. 16:57:16(UTC)
Lenich

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

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

При вызове:
Код:

csptest -sfenc -decrypt -in "1234.txtE"

вывод:
Код:

CSP (Type:75) v3.6.5359 KC1 Release Ver:3.6.6497 OS:Windows CPU:AMD64 FastCode:NoHardwareSupport
An error occurred in running the program.
.\tmain.c:2447:Subject Name undefined.
Error number 0x12 (18).
Больше файлов не осталось.

An error occured in running the program.
.\cryptsf.c:480:Cannot find User certificate
Error number 0x12 (18).
Больше файлов не осталось.

Total: SYS: 0,031 sec USR: 0,000 sec UTC: 0,053 sec
[ErrorCode: 0x00000012]


А как задать с использованием имени сертификата - не понятно ("Сертификаты" (в Крипто-Про) - пишет в поле "имя": <НЕТ>)

При вызове:
Код:

csptest -lowenc -decrypt -in "1234.txtE"

вывод:
Код:

CSP (Type:75) v3.6.5359 KC1 Release Ver:3.6.6497 OS:Windows CPU:AMD64 FastCode:NoHardwareSupport.
An error occurred in running the program.
.\cryptlo.c:526:No user certificate specified.

Error number 0x0 (0).
Операция успешно завершена.

Total: SYS: 0,016 sec USR: 0,000 sec UTC: 0,037 sec
[ErrorCode: 0x07777777]
Offline Lenich  
#4 Оставлено : 14 сентября 2010 г. 17:05:53(UTC)
Lenich

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

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

Разобрался с именами сертификатов. Но, тем не менее:
Код:

csptest -lowenc -decrypt -in "1234.txtE" -my "[Мое имя]"
CSP (Type:75) v3.6.5359 KC1 Release Ver:3.6.6497 OS:Windows CPU:AMD64 FastCode:NoHardwareSupport.
#0:
Subject:[Инфа обо мне]
Valid  : 10.09.2010 - 10.09.2011
Issuer : [Инфа об УЦ]

A CSP has been acquired.
Default Provider will be used with CryptMsgOpenToEncode.
The message to decode has been opened.
The message to decode has been updated.
The message type has been retrieved.
The OID of the inner content type is: 1.2.840.113549.1.7.1.
An error occurred in running the program.
.\cryptlo.c:763:CryptMsgControl. Decode decryption failed.
Error number 0x80091008 (2148077576).
Неправильное значение индекса.

Total: SYS: 0,109 sec USR: 0,016 sec UTC: 0,198 sec
[ErrorCode: 0x80091008]


И с использованием -sfenc
Код:

csptest -sfenc -decrypt -in "1234.txtE" -my "[Мое имя]"
CSP (Type:75) v3.6.5359 KC1 Release Ver:3.6.6497 OS:Windows CPU:AMD64 FastCode:NoHardwareSupport.
#0:
Subject: [Инфа обо мне]
Valid  : 10.09.2010 - 10.09.2011
Issuer : [Инфа об УЦ]

An error occurred in running the program.
.\cryptsf.c:555:Error decrypting message.
Error number 0x8009200c (2148081676).
Не удается найти сертификат и закрытый ключ для расшифровки.

Total: SYS: 0,016 sec USR: 0,000 sec UTC: 0,066 sec
[ErrorCode: 0x8009200c]

Отредактировано пользователем 14 сентября 2010 г. 17:06:31(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#5 Оставлено : 14 сентября 2010 г. 19:47:53(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Ошибка та же самая - сертификат получателя не установлен, либо установлен без ссылки на закрытый ключ.
Техническую поддержку оказываем тут
Наша база знаний
Offline Lenich  
#6 Оставлено : 14 сентября 2010 г. 20:10:26(UTC)
Lenich

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

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

Устанавливал через CryptoPro CSP
Там "сервис/установить личный сертификат..."
Выбрал файл (.cer),
выбрал ключевой контейнер с флэшки (это единственный контейнер, который находит),
Ввел пароль
Выбрал имя хранилища сертификатов: "Личное", поставил галочку "установить сертификат в контейнер"
Ткнул "готово"..

Вроде все как в инструкции..(повторил это все еще раз)

В сертификатах текущего пользователя он есть.
Если там его открыть (сведения о сертификате) - внизу написано: "Есть закрытый ключ, соответствующий этому сертификату"

Но ошибки, тем не менее, никуда не исчезли

Вроде все в порядке..
Или все же нет?
Offline Kirill Sobolev  
#7 Оставлено : 14 сентября 2010 г. 21:31:59(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
А в IE свойства - содержание - сертификаты он виден?
Техническую поддержку оказываем тут
Наша база знаний
Offline Lenich  
#8 Оставлено : 14 сентября 2010 г. 22:48:01(UTC)
Lenich

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

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

Да, виден
Offline Lenich  
#9 Оставлено : 15 сентября 2010 г. 3:17:41(UTC)
Lenich

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

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

Под дебианом такая же ошибка (код тот же. тоже gcc) вылезает еще на 1-ом (первом) CryptDecryptMessage (который для определения размера)

при этом:
Код:

# ./certmgr -store My -list
Certmgr 0.9 prerelease (c) "CryptoPro",  2007-2010.
program for managing certificate(CRL) and stores

=============================================================================
1-------
Issuer         : [Инфа об УЦ]
Subject        : CN=ROOTKEY
Serial         : 0x7C5E0000000080B33A1A
PrivateKey Link: Yes. Container: HDIMAGE\\ROOTKEY.000\0FCF
=============================================================================

[ErrorCode: 0x00000000]

Код:

# ./certmgr -store MY -list
Certmgr 0.9 prerelease (c) "CryptoPro",  2007-2010.
program for managing certificate(CRL) and stores

=============================================================================
1-------
Issuer         : [Инфа об УЦ]
Subject        : CN=ROOTKEY
Serial         : 0x7C5E0000000080B33A1A
PrivateKey Link: Yes. Container: HDIMAGE\\ROOTKEY.000\0FCF
=============================================================================

[ErrorCode: 0x00000000]



Как провести csptest -lowenc и -sfenc - не понятно (он там не знает таких параметров)

При этом тест "-cpenc -sender '...' -recipient '...' -test " - и там и там проходит без ошибок
Offline Kirill Sobolev  
#10 Оставлено : 15 сентября 2010 г. 16:46:27(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Выложите, пожалуйста, 1234.txtE.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.