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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dzhukov  
#1 Оставлено : 31 октября 2017 г. 14:52:52(UTC)
dzhukov

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

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

Сказал(а) «Спасибо»: 3 раз
Всем привет.

Согласно: [ ЖТЯИ.00088-01 95 01. Правила пользования.pdf ]
у ф-ии [ CryptSignHash ] есть ограничения на использования:
[
Разрешено использование только с ключевыми контейнерами, полученными ранее с помощью вызова
CertGetCertificateContextProperty из сертификата, проверенного с помощью функции
CertVerifyCertificateChainPolicy
]

У меня есть код, который мне достался и надо это ограничение соблюсти,
помогите плииииииииииз.

вот значимые части кода:

1) [ получаем дескриптор контейнера ключей (hProv) ]

Код:
	HCRYPTPROV hProv = 0;
		if (!CryptAcquireContext(
			&hProv,
			name.c_str(),
			NULL,
			PROV_GOST_2001_DH,
			0)){
			printf("JNI: getSignContext break on CryptAcquireContext [%d] for [%s]\n", GetLastErrorLocal(), name.c_str());
			return 0;
		}



2) [ потом используем (hProv) для получения (hHash) ]
Код:

		if (!CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash)){
			printf("JNI: do_low_sign_hash break on CryptCreateHash [%d]\n", GetLastErrorLocal());
			cleanUp(hHash, data, hProv);
			return 0;
		}


3) [ потом используем (hHash) ]
Код:

		if (!CryptSetHashParam(hHash, HP_OID, (BYTE*)OID_HashVerbaO, 0)){
			printf("JNI: do_low_sign_hash break on CryptSetHashParam [%d]\n", GetLastErrorLocal());
			cleanUp(hHash, data, hProv);
			return 0;
		}
		if (!CryptHashData(hHash, pbContent, cbContent, 0)){
			printf("JNI: do_low_sign_hash break on CryptHashData [%d]\n", GetLastErrorLocal());
			cleanUp(hHash, data, hProv);
			return 0;
		}

		result->size = 0;
		if (!CryptSignHash(hHash, keySpec, NULL, 0, NULL, &(result->size))){
			flipKeySpec(keySpec);
			if (!CryptSignHash(hHash, keySpec, NULL, 0, NULL, &(result->size))){
				printf("JNI: do_low_sign_hash break on CryptSignHash [%d]\n", GetLastErrorLocal());
				cleanUp(hHash, data, hProv);
				return 0;
			}
		}
		result->blob = new BYTE[result->size];
		BOOL isSuccessful = 1;
		if (!CryptSignHash(hHash, keySpec, NULL, 0, result->blob, &result->size)){
			isSuccessful = 0;
			printf("JNI: do_low_sign_hash break on CryptSignHash final [%d]\n", GetLastErrorLocal());
		}



ВОПРОС: я не совсем понимаю как мне тут прикрутить условие для ф-ии [ CryptSignHash ]
чтобы оно соответствовало документации? Хелп плиииз
Offline Русев Андрей  
#2 Оставлено : 31 октября 2017 г. 15:55:07(UTC)
Русев Андрей

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

Группы: Администраторы, Участники
Зарегистрирован: 16.04.2008(UTC)
Сообщений: 1,261

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 443 раз в 322 постах
Ещё в мае этого года для CryptSignHash была расширена формулировка (в доках на CSP 4.0 R3 она уже есть: https://www.cryptopro.ru...wnloads#latest_csp40r3):
Цитата:
Разрешено использование только с ключевыми контейнерами, полученными ранее с помощью вызова CryptAcquireCertificatePrivateKey либо с помощью вызова CertGetCertificateContextProperty из сертификата, проверенного с помощью функции CertVerifyCertificateChainPolicy

Поэтому в вашем коде надо заменить CryptAcquireContext() на CryptAcquireCertificatePrivateKey().
Официальная техподдержка. Официальная база знаний.
thanks 1 пользователь поблагодарил Русев Андрей за этот пост.
dzhukov оставлено 31.10.2017(UTC)
Offline dzhukov  
#3 Оставлено : 31 октября 2017 г. 21:15:34(UTC)
dzhukov

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

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

Сказал(а) «Спасибо»: 3 раз
спасибо большое,

простите, но не могли бы вы пояснить немного замену функций
[CryptAcquireContext()] на [CryptAcquireCertificatePrivateKey()]


у меня просто есть во такая сигнатура ф-ии подписания:
[ BOOL do_low_sign_hash(BYTE * pbContent, DWORD cbContent, std::string certName, std::string password, BYTE_ARRAY * result) ]

Код:
BOOL do_low_sign_hash(BYTE * pbContent, DWORD cbContent, std::string certName, std::string password, BYTE_ARRAY * result)
{
	HCRYPTHASH hHash = 0;
	BYTE_ARRAY data = { pbContent, cbContent };
	DWORD keySpec = AT_KEYEXCHANGE;

	HCRYPTPROV hProv;
	try {
		
		HCRYPTPROV hProv = 0;
		if (!CryptAcquireContext(
			&hProv,
			name.c_str(),
			NULL,
			PROV_GOST_2001_DH,
			0)){
			printf("JNI: getSignContext break on CryptAcquireContext [%d] for [%s]\n", GetLastErrorLocal(), name.c_str());
			return 0;
		}
		if (!CryptSetProvParam(hProv, PP_SIGNATURE_PIN, (BYTE*)password.c_str(), 0)){
			printf("JNI: do_low_sign_hash break on CryptSetProvParam [%d]\n", GetLastErrorLocal());
			//		cleanUp(hHash, data);
			return 0;
		}
		
		
		if (!hProv){
			printf("JNI: do_low_sign_hash break on acquiring signing context \n");
			cleanUp(hHash, data);
			return 0;
		}

		if (!CryptCreateHash(hProv, CALG_GR3411, 0, 0, &hHash)){
			printf("JNI: do_low_sign_hash break on CryptCreateHash [%d]\n", GetLastErrorLocal());
			cleanUp(hHash, data, hProv);
			return 0;
		}
		if (!CryptSetHashParam(hHash, HP_OID, (BYTE*)OID_HashVerbaO, 0)){
			printf("JNI: do_low_sign_hash break on CryptSetHashParam [%d]\n", GetLastErrorLocal());
			cleanUp(hHash, data, hProv);
			return 0;
		}
		if (!CryptHashData(hHash, pbContent, cbContent, 0)){
			printf("JNI: do_low_sign_hash break on CryptHashData [%d]\n", GetLastErrorLocal());
			cleanUp(hHash, data, hProv);
			return 0;
		}

		result->size = 0;
		if (!CryptSignHash(hHash, keySpec, NULL, 0, NULL, &(result->size))){
			flipKeySpec(keySpec);
			if (!CryptSignHash(hHash, keySpec, NULL, 0, NULL, &(result->size))){
				printf("JNI: do_low_sign_hash break on CryptSignHash [%d]\n", GetLastErrorLocal());
				cleanUp(hHash, data, hProv);
				return 0;
			}
		}
		result->blob = new BYTE[result->size];
		BOOL isSuccessful = 1;
		if (!CryptSignHash(hHash, keySpec, NULL, 0, result->blob, &result->size)){
			isSuccessful = 0;
			printf("JNI: do_low_sign_hash break on CryptSignHash final [%d]\n", GetLastErrorLocal());
		}
		CryptDestroyHash(hHash);
		//CryptReleaseContext(hProv, 0);
		return isSuccessful;
	} catch (std::exception *e) {
		printf((*e).what());
		cleanUp(hHash, data, hProv);
		return 0;
	}
}



(*) ВОПРОС: могу ли я не меняя сигнатуру функции [do_low_sign_hash] осуществить замену
[CryptAcquireContext()] на [CryptAcquireCertificatePrivateKey()]?

P.S
я так понимаю мне надо в функцию добавить передачу сертификата,
в моем случае ввиде массива байт? чтобы потом получить [PCCERT_CONTEXT]
[ PCCERT_CONTEXT cert = (PCCERT_CONTEXT) (CertCreateCertificateContext(TYPE_DER, certBlob.blob, certBlob.size) ); ]

проооооостите что напрягаю, чет не клеется у меня с этим кодом((((
помогите плиз.




Offline Андрей Писарев  
#4 Оставлено : 31 октября 2017 г. 21:29:02(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,630
Мужчина
Российская Федерация

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Варианты:
а) скачать и посмотреть в SDK
б) поиск примера по форуму
в) поиск примера по msdn
г) ждать, когда кто-то пришлет кусочек из а)..в)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
dzhukov оставлено 31.10.2017(UTC)
Offline dzhukov  
#5 Оставлено : 1 ноября 2017 г. 19:42:00(UTC)
dzhukov

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

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

Сказал(а) «Спасибо»: 3 раз
спасибо большое,
переписал код,
использую цепочку из

hStoreHandle = CertOpenSystemStore(0, "MY");

pCertSender = CertFindCertificateInStore(... вот тут надо указать
(*) The Unicode string to be found
in a certificate's subject

verifyCertificateChain(pCertSender) ...
CryptAcquireCertificatePrivateKey(...
...


помогите плииииииз, где посмотреть имя сертификата или
по какой строчке его можно найти, используя
[ CertFindCertificateInStore ]\


(***) а блин там много вариантов поиска сертификатов, сорь
[ https://msdn.microsoft.com/en-us/library/windows/desktop/aa376064(v=vs.85).aspx ]

прислали только скрин вывода [/opt/cprocsp/bin/amd64/certmgr -list]

Отредактировано пользователем 1 ноября 2017 г. 20:36:16(UTC)  | Причина: Не указана

Offline dzhukov  
#6 Оставлено : 8 декабря 2017 г. 11:24:25(UTC)
dzhukov

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

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

Сказал(а) «Спасибо»: 3 раз
Большое спасибо все завелось
с [ CryptAcquireCertificatePrivateKey() ]


появилась необходимость использовать именно [ CertGetCertificateContextProperty() ]
для получения [ HCRYPTPROV ]

т.к
"Мы обязаны использовать те ограничения, которые описаны в документе
для сертифицированной, закупленной версии криптопро."

- CryptSignHash:
Разрешено использование только с ключевыми контейнерами, полученными ранее с помощью
вызова CertGetCertificateContextProperty из сертификата, проверенного с помощью
функции CertVerifyCertificateChainPolicy


заменяю этот кусочек:

Код:
 
        if(!CryptAcquireCertificatePrivateKey(
            pCertContext,
            0,
            NULL,
            &hProvSender,
            &dwKeySpecSender,
            NULL))
        {
            printf("JNI: Error during CryptAcquireCertificatePrivateKey. [%d]\n", GetLastErrorLocal());
        }



на такой кусочек

Код:
        
          if(!CertGetCertificateContextProperty(
                pCertContext,
                CERT_KEY_PROV_HANDLE_PROP_ID,
                &hProvSender,
                &cbData))
           {
               printf("JNI: Error during CertGetCertificateContextProperty. [%d]\n", GetLastErrorLocal());
           }


но вылетает ошибка [0x80092004]

я так понимаю этот ключик не поддерживается [ CERT_KEY_PROV_HANDLE_PROP_ID ]
как мне достать [ HCRYPTPROV (*)hProvSender] подскажите плииииииииз

Отредактировано пользователем 8 декабря 2017 г. 13:27:15(UTC)  | Причина: Не указана

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