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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Lenich  
#1 Оставлено : 16 сентября 2010 г. 2:24:58(UTC)
Lenich

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

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

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

Используется Debian, 64-х битный сервер

Имеется код для шифрования и подписи сообщения (код на С):
Код:

CERT_KEY_CONTEXT PrivateKeyInfo;
    HCRYPTPROV prov;
	PCCERT_CONTEXT Ecert;
	PCCERT_CONTEXT myCert;
	HCERTSTORE Hstore;
	HCERTSTORE store;
    DWORD cbSignature=0;
    DWORD cbEncryptedBlob;
    DWORD size=0;
    DWORD len;
	DWORD allLen = 0;
    CRYPT_ALGORITHM_IDENTIFIER EncryptAlgorithm;
    CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;
    CRYPT_ENCRYPT_MESSAGE_PARA EncryptParams;
	CRYPT_SIGN_MESSAGE_PARA SignParams;
    BYTE* pbEncryptedBlob = NULL;
    BYTE* pbSignature;
    BYTE* params;
    BYTE* data;
	FILE* in;
	
	ALG_ID ke_alg = CALG_PRO_EXPORT;
	
    if (!CryptAcquireContext(&prov,NULL,NULL,75,CRYPT_VERIFYCONTEXT))
    {}
    
    if (!CryptGetProvParam(prov,PP_ENUMCONTAINERS,NULL,&size,CRYPT_FIRST))
    {}
    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))
    {}
	
	in = fopen(argv[5],"rb");
	data = malloc(sizeof(BYTE)*4096);
	len = (DWORD)fread(data, 1, 4096, in); // считывание сертификата получателя
	fclose(in);
	char buff[33];
	if (!(Hstore = CertOpenStore((LPCSTR) CERT_STORE_PROV_MEMORY,ENC_TYPE,prov,0,NULL)))
	{}
	if (!CertAddEncodedCertificateToStore(Hstore,ENC_TYPE,data,len,CERT_STORE_ADD_NEW,&Ecert))
	{}
	free(data);
	
	in = fopen(argv[4],"rb");
	data = malloc(sizeof(BYTE)*4096); // считывание сертификата отправителя
	len = (DWORD)fread(data, 1, 4096, in);
	fclose(in);
	
	store = CertOpenSystemStore(prov,"My");
	if ((!CertAddEncodedCertificateToStore(store,ENC_TYPE,data,len,CERT_STORE_ADD_USE_EXISTING,&myCert) || !myCert))
	{}
	free(data);
	memset(&PrivateKeyInfo, 0, sizeof(CERT_KEY_CONTEXT));
	PrivateKeyInfo.hCryptProv = prov;
	PrivateKeyInfo.dwKeySpec = AT_KEYEXCHANGE;
	PrivateKeyInfo.cbSize = sizeof(PrivateKeyInfo);
	if (!CertSetCertificateContextProperty(myCert,CERT_KEY_CONTEXT_PROP_ID,0,&PrivateKeyInfo))
	{} // Проставить флаг привязки (хотя он, как выяснится, ни на что не влияет)

	memset(&EncryptAlgorithm, 0, sizeof(CRYPT_ALGORITHM_IDENTIFIER));
    EncryptAlgorithm.pszObjId = szOID_CP_GOST_28147;
    
	memset(&EncryptParams, 0, sizeof(CRYPT_ENCRYPT_MESSAGE_PARA));
    EncryptParams.cbSize =  sizeof(CRYPT_ENCRYPT_MESSAGE_PARA);
    EncryptParams.dwMsgEncodingType = ENC_TYPE;
    EncryptParams.hCryptProv = prov;
    EncryptParams.ContentEncryptionAlgorithm = EncryptAlgorithm;
    
    memset(&HashAlgorithm, 0, sizeof(CRYPT_ALGORITHM_IDENTIFIER));
    HashAlgorithm.pszObjId = szOID_CP_GOST_28147;
    
    memset(&SignParams, 0, sizeof(CRYPT_SIGN_MESSAGE_PARA));
    SignParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
    SignParams.dwMsgEncodingType = ENC_TYPE;
    SignParams.pSigningCert = myCert;
    SignParams.HashAlgorithm = HashAlgorithm; //Далее куча нулей - тоже ни на что не влияет
    SignParams.pvHashAuxInfo = NULL;
    SignParams.cMsgCert = 0;
    SignParams.rgpMsgCert = NULL;
    SignParams.cMsgCrl = 0;
    SignParams.rgpMsgCrl = NULL;
    SignParams.cAuthAttr = 0;
    SignParams.rgAuthAttr = 0;
    SignParams.cUnauthAttr = 0;
    SignParams.rgUnauthAttr = 0;
    SignParams.dwFlags = 0;
    SignParams.dwInnerContentType = 0;
    
	in = fopen(argv[1],"r");
	data = malloc(sizeof(BYTE)*4096);
	len = (DWORD)fread(data, 1, 4096, in); //Считываем данные. они точно туда влезают
    
	const BYTE **arr = malloc(sizeof(BYTE*));
	arr[0] = data;
	
	if (!CryptSignMessage(&SignParams,1,1,arr,&len,NULL,&cbSignature))
	{
		char buff[33];
		int a = GetLastError();
		itoa(a,buff,10);
		HandleError(buff,0);
		HandleError("Unable to get Sign size",1);
	}


Далее, собственно, не очень важно.. CryptSignMessage выпадает с ошибкой: 87L (неправильный параметр)
Сертификат - один:
Код:

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

=============================================================================
1-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : CN="ROOTKEY C=RU S=Moscow E=me@mail.ru"
Serial         : 0xD59200000200ABA11734
PrivateKey Link: Yes. Container: HDIMAGE\\ROOT.000\06B2
=============================================================================



Контейнер выбирается правильный (проследил)
Пробовал делать findcertificate в store (в My по сути) - ничего не меняется

Наиболее смущает то, что этот же код под виндой - работает. (нормально все шифрует)
Сертификат в сведениях (смотрел под виндой) - написано, что для шифрования и идентификации (вроде то, что нужно)

Сертификат делал через крипто-прошный сервис
Может ли быть такое, что это из-за того, что не установлен сертификат УЦ (под виндой - все установлено.. + там ключ генерировался не мной + там подписывал сертификат другой УЦ)?
Если проблема в этом, то как его установить?

или в чем может быть проблема?

P.S. Если шифрование поставить выше подписи (CryptEncryptMessage), то шифруется нормально.. но с подписью проблема остается

*Цепочка сертификатов и просто отдельно сертификат - в аттаче*

Отредактировано пользователем 16 сентября 2010 г. 2:42:13(UTC)  | Причина: Не указана

Вложение(я):
321.cer (1kb) загружен 15 раз(а).
certnew.p7b (2kb) загружен 16 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Lenich  
#2 Оставлено : 16 сентября 2010 г. 2:52:22(UTC)
Lenich

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

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

Попробовал установить сертификат.. что-то хмм:
Код:

# ./certmgr -inst -store ROOT -file /usr/ahrejl/C/certnew.p7b
Certmgr 0.9 prerelease (c) "CryptoPro",  2007-2010.
program for managing certificate(CRL) and stores

=============================================================================
1-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Serial         : 0xD35FDE492D623546BA59A66A28038469
PrivateKey Link: No
2-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : CN="ROOTKEY C=RU S=Moscow E=me@mail.ru"
Serial         : 0xD59200000200ABA11734
PrivateKey Link: No
=============================================================================
Please choose the number of certificate
1
Install:
=============================================================================
1-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Serial         : 0xD35FDE492D623546BA59A66A28038469
PrivateKey Link: No
=============================================================================

[ErrorCode: 0x00000000]



Вроде как ошибок нет, должен бы установиться.. но:
Код:

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

=============================================================================
1-------
Issuer         : E=info@cryptopro.ru, C=RU, O=CRYPTO-PRO, CN=Test Center CRYPTO-PRO
Subject        : CN="ROOTKEY C=RU S=Moscow E=me@mail.ru"
Serial         : 0xD59200000200ABA11734
PrivateKey Link: Yes. Container: HDIMAGE\\ROOT.000\06B2
=============================================================================

[ErrorCode: 0x00000000]


Почему-то в листе его нет.. странно это.. :(
Offline Lenich  
#3 Оставлено : 16 сентября 2010 г. 15:20:30(UTC)
Lenich

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

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

Забыл упомянуть:
расшифровка сообщения проходит без ошибок (CryptDecryptMessage), как и проверка подписи (если подписать под виндой, к примеру) (CryptVerifyDetachedMessageSignature)
(все считывается такими же методами)
Offline Andrey Nechaev  
#4 Оставлено : 21 сентября 2010 г. 16:19:19(UTC)
Andrey Nechaev

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

Группы: Участники
Зарегистрирован: 07.09.2010(UTC)
Сообщений: 11
Мужчина
Откуда: Йошкар-Ола, Цифровые технологии

Сказал «Спасибо»: 1 раз
Lenich написал:

Код:
    memset(&HashAlgorithm, 0, sizeof(CRYPT_ALGORITHM_IDENTIFIER));
    HashAlgorithm.pszObjId = szOID_CP_GOST_28147;


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