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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline forik  
#1 Оставлено : 27 марта 2012 г. 14:58:26(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Здравствуйте!
Нужно передать пароль контейнера в функцию CryptSignMessage(). Я так думаю, что для начала нужно получить контекст сертификата через CertCreateCertificateContext(), затем к хендлу полученного контекста добавить CERT_KEY_PROV_HANDLE_PROP_ID, в котором с помощью функции CryptSetProvParam(PP_SIGNATURE_PIN) установить как раз таки нужный пароль. Поправьте, где не прав...
Offline Максим Коллегин  
#2 Оставлено : 27 марта 2012 г. 15:51:18(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 39 раз
Поблагодарили: 750 раз в 645 постах
Примерно так.
Нужно открыть провайдер вызовом CryptAcquireCertificatePrivateKey и устновать PP_KEYEXCHANGE_PIN\PP_SIGNATURE_PIN
Так же можно запомнить пин в контексте сертификата.
Знания в базе знаний, поддержка в центре поддержки
Offline forik  
#3 Оставлено : 27 марта 2012 г. 17:54:23(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Спасибо, а вот кстати, какой ключ нужно устанавливать PP_KEYEXCHANGE_PIN\PP_SIGNATURE_PIN? Просто dwKeySpec ключа будет AT_KEYEXCHANGE.
А разве CryptAcquireCertificatePrivateKey сама по себе не заставляет пароль вводить?
Offline forik  
#4 Оставлено : 28 марта 2012 г. 13:22:59(UTC)
forik

Статус: Активный участник

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

Сказал(а) «Спасибо»: 2 раз
Что-то не получается ничего (
Код:
HCRYPTPROV hProv = 0;
	if(!CryptAcquireContext(
		&hProv,
		CONTAINER,
		VPN_DEF_PROV,
		VPN_PROV_TYPE,
		CRYPT_SILENT))
	{
		printf("%x",GetLastError());
	}

	HCRYPTKEY hKey = 0;
	if(!CryptGetUserKey(
		hProv,
		AT_KEYEXCHANGE,
		&hKey))
	{
		printf("%x",GetLastError());
	}

	BYTE *pbData;
	DWORD pdwDataLen = 0;
	if(!CryptGetKeyParam(
		hKey,
		KP_CERTIFICATE,
		NULL,
		&pdwDataLen,
		0))
	{
		printf("%x",GetLastError());
		return;
	}
	pbData = new BYTE[pdwDataLen];
	if(!CryptGetKeyParam(
		hKey,
		KP_CERTIFICATE,
		pbData,
		&pdwDataLen,
		0))
	{
		printf("%x",GetLastError());
	}

	PCCERT_CONTEXT pCert;
	if( ! (pCert = CertCreateCertificateContext(
		MY_TYPE,
		pbData,
		pdwDataLen)))
	{
		printf("%x",GetLastError());
		return;
	}

	BYTE *pbProvParam = (BYTE*)"123123";
	if(!CryptSetProvParam(
		hProv,
		PP_SIGNATURE_PIN,
		pbProvParam,
		0))
	{
		printf("%x",GetLastError());
		return;
	}

	if(!CertSetCertificateContextProperty(
		pCert,
		CERT_KEY_PROV_HANDLE_PROP_ID,
		0,
		&hProv))
	{
		printf("%x",GetLastError());
	}

Затем заполняю структуру CRYPT_SIGN_MESSAGE_PARA и подписываю:
Код:
if(CryptSignMessage(
		&SigParams,
		TRUE,
		1,
		MessageArray,
		MessageSizeArray,
		NULL,
		&cbSignedMessageBlob))
	{
		printf("Sign size: %d.\n", cbSignedMessageBlob);
	}
	else
	{
		HandleError("CryptSignMessage");
	}

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