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

Уведомление

Icon
Error

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

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

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

Делаю как в MSDN.
При вызове функции CertFindCertificateInStore не находит сертификата в "Личных" сертификатах. который называетя Gafarov_Artur.
Поле "Субъект" в сертификате:

STREET = пр.Ленина, 40
CN = Gafarov_Artur
O = ЦТБ
L = Томск
S = Томская
C = RU

Ну и вот сам код.

Код:

	// Открытие хранилища сертификатов.
	// CertOpenStore - http://msdn.microsoft.com/en-us/library/aa376559(VS.85).aspx
	if ( hCertStore = CertOpenStore(
								CERT_STORE_PROV_SYSTEM,
								0, // encoding type. 0 или X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
								NULL,
								CERT_SYSTEM_STORE_CURRENT_USER,
								L"MY"))
	printf("The MY store is opened");
	else printf("The MY store could not be opened.");

	LPWSTR lpszCertSubject = L"Gafarov_Artur";

	// Get the certificate for the signer.
	if(pSignerCertContext = CertFindCertificateInStore(
		hCertStore,
		MY_ENCODING_TYPE,
		0,
		CERT_FIND_SUBJECT_STR,
		lpszCertSubject,
		NULL))
	printf("%s%d%s","Certificate",lpszCertSubject," was found"); // на эту строку внимания не обращайте,
																// я даже не знаю как ее правильно писать, я cout использую
	else
	{
		printf("%s%d%s","Certificate",lpszCertSubject," not found");
		exit(1);
	}

я может и совсем глупую ошибку сделал. но прошу объяснения, пожалуйста
Природа - МАТЬ, и её надо беречь!
Offline cplusplus  
#2 Оставлено : 29 апреля 2009 г. 15:49:14(UTC)
cplusplus

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

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

Если применяю CERT_FIND_ANY вместо CERT_FIND_SUBJECT_STR, то сертификат вроде находит, но вызов следующей функции показывает другой сертификат, не то что я искал:

Код:
if(CertGetNameString(
		pSignerCertContext ,
		CERT_NAME_SIMPLE_DISPLAY_TYPE,
		0,
		NULL,
		pszNameString,
		MAX_NAME) > 1)
	{
		cout - "The SIMPLE_DISPLAY_TYPE message signer's name is  " - pszNameString - endl;
		_tprintf(
			TEXT("The SIMPLE_DISPLAY_TYPE message signer's name is ")
			TEXT("%s \n"),
			pszNameString);


	}
	else
	{
		MyHandleError(
			TEXT("Getting the name of the signer failed.\n"));
	}



у меня два сертификата стоит, вот он следующий и показывает. как быть?
Природа - МАТЬ, и её надо беречь!
Offline Kirill Sobolev  
#3 Оставлено : 29 апреля 2009 г. 18:33:58(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
А MY_ENCODING_TYPE что такое?
CERT_FIND_ANY находит просто любой сертификат, критерии поиска не учитываются.
Техническую поддержку оказываем тут
Наша база знаний
Offline cplusplus  
#4 Оставлено : 10 мая 2009 г. 2:13:24(UTC)
cplusplus

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

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

#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Природа - МАТЬ, и её надо беречь!
Offline Kirill Sobolev  
#5 Оставлено : 12 мая 2009 г. 14:09:56(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
На сам сертификат "Gafarov_Artur" можно взглянуть?
Техническую поддержку оказываем тут
Наша база знаний
Offline cplusplus  
#6 Оставлено : 19 мая 2009 г. 3:51:45(UTC)
cplusplus

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

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

вот открытый сертификат.

пока я сделал вот так: (и терпимо работает вроде)
Код:

// Get the certificate for the signer.
	while (pSignerCertContext = CertEnumCertificatesInStore(hCertStore, pSignerCertContext))
	{
		if (!strcmp(pSignerCertContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId, szOID_CP_GOST_R3410EL))
		{
		CertGetNameString(
		pSignerCertContext ,
		CERT_NAME_SIMPLE_DISPLAY_TYPE,
		0,
		NULL,
		pszNameString,
		MAX_NAME);
		if (!strcmp(pszNameString,CharBuff_Signer))
		{
			// CryptAcquireCertificatePrivateKey – получает дескриптор CSP провайдера
			// соответствующего сертификата.
			if(( CryptAcquireCertificatePrivateKey( pSignerCertContext,
													0,
													NULL,
													&hCryptProv,
													&dwKeySpec,
													NULL)))
			{
				Form1->Memo1->Lines->Add("CryptAcquireCertificatePrivateKey выполнилась успешно");
				break;
			}
			else
			{
				Form1->Memo1->Lines->Add("Error CryptAcquireCertificatePrivateKey");
				break;
			}
		}
		}
	}

Отредактировано пользователем 19 мая 2009 г. 3:55:00(UTC)  | Причина: Не указана

Вложение(я):
Gafarov_Artur.cer (2kb) загружен 27 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Природа - МАТЬ, и её надо беречь!
Offline Kirill Sobolev  
#7 Оставлено : 19 мая 2009 г. 15:40:21(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Странно.
У меня этот код находит этот сертификат в личных без проблем (WS 2003 R2, VS 2008).
Техническую поддержку оказываем тут
Наша база знаний
Offline Максим Коллегин  
#8 Оставлено : 19 мая 2009 г. 15:48:59(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Код:
//ошибка или недоработка в wincrypt.h
#ifdef CERT_FIND_SUBJECT_STR
#   undef CERT_FIND_SUBJECT_STR
#   undef CERT_FIND_ISSUER_STR
#   ifdef _UNICODE
#	define CERT_FIND_SUBJECT_STR	CERT_FIND_SUBJECT_STR_W
#	define CERT_FIND_ISSUER_STR	CERT_FIND_ISSUER_STR_W
#   else
#	define CERT_FIND_SUBJECT_STR	CERT_FIND_SUBJECT_STR_A
#	define CERT_FIND_ISSUER_STR	CERT_FIND_ISSUER_STR_A
#   endif // !UNICODE
#endif
Знания в базе знаний, поддержка в техподдержке
Offline cplusplus  
#9 Оставлено : 19 мая 2009 г. 16:20:12(UTC)
cplusplus

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

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

Kirill Sobolev написал:
Странно.
У меня этот код находит этот сертификат в личных без проблем (WS 2003 R2, VS 2008).


У меня C++CodeGear 2009, пробывал и в VS 2008. Там тоже не сработала. Виндовс ХР, СП 3.
Природа - МАТЬ, и её надо беречь!
Offline cplusplus  
#10 Оставлено : 19 мая 2009 г. 16:22:30(UTC)
cplusplus

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

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

maxdm написал:
Код:
//ошибка или недоработка в wincrypt.h
#ifdef CERT_FIND_SUBJECT_STR
#   undef CERT_FIND_SUBJECT_STR
#   undef CERT_FIND_ISSUER_STR
#   ifdef _UNICODE
#	define CERT_FIND_SUBJECT_STR	CERT_FIND_SUBJECT_STR_W
#	define CERT_FIND_ISSUER_STR	CERT_FIND_ISSUER_STR_W
#   else
#	define CERT_FIND_SUBJECT_STR	CERT_FIND_SUBJECT_STR_A
#	define CERT_FIND_ISSUER_STR	CERT_FIND_ISSUER_STR_A
#   endif // !UNICODE
#endif


Можно здесь подробнее??? У меня в винкрипт.h нет даже строки #ifdef CERT_FIND_SUBJECT_STR.
Природа - МАТЬ, и её надо беречь!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.