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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline akulema  
#1 Оставлено : 3 декабря 2008 г. 13:48:25(UTC)
akulema

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

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

Здравствуйте, а можно ли имея контейнер КриптоПро на флешке получить сертификат этого ключа?

то есть я имею нечто следующее
Код:
if(!CryptAcquireContext(&hCryptProvCA, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
		{			
			return false;
		}

		cbData=1000;
		pbData = new BYTE[1024];
		if(!CryptGetProvParam( hCryptProvCA, PP_SELECT_CONTAINER , 	pbData, &cbData, 	0))
		{			
			return false;
		}

		CString kontainer_name=pbData;
		CryptReleaseContext(hCryptProvCA, 0);

		if(!CryptAcquireContext(  &hCryptProvCA,    kontainer_name,    NULL,   PROV_GOST_2001_DH,    0))
		{			
			return false;
		}


из контекста можно ли при этом что-нибудь выцепить?
Offline Максим Коллегин  
#2 Оставлено : 3 декабря 2008 г. 14:28:31(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Если в контейнере есть сертификат, то GetUserKey, GetKeyParam(KP_CERTIFICATE)
Знания в базе знаний, поддержка в техподдержке
Offline akulema  
#3 Оставлено : 3 декабря 2008 г. 14:37:05(UTC)
akulema

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

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

Прошу прощения, может, за глупый вопрлс, но где находятся эти функции?
Offline Максим Коллегин  
#4 Оставлено : 3 декабря 2008 г. 16:22:23(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
CryptGetUserKey, CryptGetKeyParam - там же, где и CryptAcquireContext
Знания в базе знаний, поддержка в техподдержке
Offline akulema  
#5 Оставлено : 3 декабря 2008 г. 18:41:12(UTC)
akulema

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

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

Спасибо, сразу не понял, что это было сокращенно =))
Offline akulema  
#6 Оставлено : 5 декабря 2008 г. 13:08:56(UTC)
akulema

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

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

Столкнулся с проблемой. Функция
Код:

CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0);

возвращает ошибку, говорит, что "Требуемый сертификат не существует". А можно ли тогда при создании записать сертификат в ключ?

P.S. Хотя, по идее, он должен быть уже в ключе

Добавлю код, которым пытаюсь получить сертификат, может, что-то не так делаю

Код:
if(!CryptAcquireContext(&hCryptProvCA, 0, 0, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT))
		{
			ShowError(GetLastError());
			return false;
		}

		cbData=1000;
		pbData = new BYTE[1024];
		if(!CryptGetProvParam( hCryptProvCA, PP_SELECT_CONTAINER , 	pbData, &cbData, 	0))
		{
			ShowError(GetLastError());
			return false;
		}

		CString kontainer_name=pbData;
		CryptReleaseContext(hCryptProvCA, 0);

		if(!CryptAcquireContext(  &hCryptProvCA,    kontainer_name,    NULL,   PROV_GOST_2001_DH,    0))
		{
			ShowError(GetLastError());
			return false;
		}		

		if(!CryptGetProvParam(hCryptProvCA, PP_CONTAINER, pbData, &cbData, 	0))
			throw("Не удалось определить имя контейнера");

		// получаем контекст сертификата ключа УЦ
		HCRYPTKEY hKey=0;
		if(!CryptGetUserKey( hCryptProvCA, AT_SIGNATURE  , &hKey))
		{
			if(!CryptGetUserKey( hCryptProvCA, AT_KEYEXCHANGE  , &hKey))
				throw ("Error during CryptGetUserKey for signkey.");			
		}

		// Проверяем сертификат
		DWORD dwUserCertLength=0;
		BYTE *UserCertBuf = 0;

		if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, UserCertBuf, &dwUserCertLength, 0))
		{
			ShowError(GetLastError());			
			throw ("Ошибка при получении сертификата (1).");
		}

		UserCertBuf=new BYTE[dwUserCertLength];

		if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, UserCertBuf,&dwUserCertLength, 0))
			throw ("Ошибка при получении сертификата (2).");


Ошибку выдает первый CryptGetKeyParam

Отредактировано пользователем 5 декабря 2008 г. 13:50:14(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#7 Оставлено : 5 декабря 2008 г. 14:37:43(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
Сертификата может и не быть в контейнере. Устанавливается функцией CryptSetKeyParam
Знания в базе знаний, поддержка в техподдержке
Offline akulema  
#8 Оставлено : 5 декабря 2008 г. 15:06:19(UTC)
akulema

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

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

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