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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
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,731
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 175 раз в 167 постах
А 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,731
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 175 раз в 167 постах
На сам сертификат "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) загружен 26 раз(а).

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

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

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

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

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

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

Сказал «Спасибо»: 17 раз
Поблагодарили: 579 раз в 520 постах
Код:
//ошибка или недоработка в 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.
Природа - МАТЬ, и её надо беречь!
Offline Максим Коллегин  
#11 Оставлено : 19 мая 2009 г. 16:37:13(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 17 раз
Поблагодарили: 579 раз в 520 постах
это цитата из нашего wincryptex.h - добавьте себе в программу. Или собирайте под UNICODE
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#12 Оставлено : 19 мая 2009 г. 16:41:50(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 17 раз
Поблагодарили: 579 раз в 520 постах
Хотя нет. Проблема возможно не в этом.
Код:
0, // encoding type. 0 или X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
- нужно писать вместо
Код:
0
Код:
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING
Знания в базе знаний, поддержка в техподдержке
Offline cplusplus  
#13 Оставлено : 19 мая 2009 г. 16:50:59(UTC)
cplusplus

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

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

maxdm написал:
это цитата из нашего wincryptex.h - добавьте себе в программу. Или собирайте под UNICODE



в Вашем WinCryptEx.h я этого тоже не нашел

(

* \file $RCSfile: WinCryptEx.h,v $
* \version $Revision: 1.105.4.6 $
* \date $Date: 2002/10/04 11:39:34 $
* \author $Author: vasilij $

)


А X509_ASN_ENCODING | PKCS_7_ASN_ENCODING попробую чуть позже, хотя вроде пробывал.

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

Природа - МАТЬ, и её надо беречь!
Offline Максим Коллегин  
#14 Оставлено : 19 мая 2009 г. 17:04:58(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 17 раз
Поблагодарили: 579 раз в 520 постах
в sdk от CSP 3.6
Знания в базе знаний, поддержка в техподдержке
Offline cplusplus  
#15 Оставлено : 19 мая 2009 г. 17:49:12(UTC)
cplusplus

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

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

Всем, всем большое спасибо.

Код:

	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))
		Form1->Memo1->Lines->Add("Certificate was found");
	else
	{
		Form1->Memo1->Lines->Add("Certificate not found");
        exit(1);
	}


Теперь работает :)

Подключил хедер новой версии:

* \file $RCSfile: WinCryptEx.h,v $
* \version $Revision: 1.211 $
* \date $Date: 2007/10/12 14:35:32 $
* \author $Author: cross $

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

Природа - МАТЬ, и её надо беречь!
Offline andreyxvo  
#16 Оставлено : 17 апреля 2012 г. 14:33:18(UTC)
andreyxvo

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

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

Здравствуйте, столкнулся с проблемой. Если имя пользователя на кого выдан сертификат (CN) содержит русские буквы, то выдается ошибка 80092004 ("Объект или свойство не найдено"). Если CN содержит только латиницу, то все работает как надо.

Ниже приведен код функции с помощью которого создаю контекст сертификата.

Если CertFindCertificateInStore(... CERT_FIND_SUBJECT_STR_A, L"Andrey" ,NULL))) то все хорошо работает.
Если CertFindCertificateInStore(...CERT_FIND_SUBJECT_STR_A, L"Андрей" ,NULL))) то не работает.

Спасибо.

Код:

bool GetCertContextFromSystemStore(PCCERT_CONTEXT *a_pCertContext,  DWORD dwCertEncodingType, LPWSTR a_StoreName,LPWSTR a_Name)
{
	HCERTSTORE hStore;					// Certificate store
	if(!(hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,          // The store provider type
		0,                               // The encoding type is// not needed				
		NULL,                            // Use the default HCRYPTPROV
		CERT_SYSTEM_STORE_CURRENT_USER,   // Set the store location in a// registry location				
		a_StoreName/*L"MY"*/ )                           // The store name as a Unicode // string				
		))
	{
		MyHandleError(_T("Не удалось найти сертификат."));
		CertCloseStore(hStore,0);
		return false;
	}

	
		if(!(*a_pCertContext=CertFindCertificateInStore(hStore,dwCertEncodingType,0,CERT_FIND_SUBJECT_STR_A, L"Andrey" ,NULL)))
		{
			MyHandleError(_T("Не найден сертификат в хранилище."));// handleError(EPOS_CERT_NOT_FOUND);
			return false;
		}		
	
	

	CertCloseStore(hStore,0);		

	return true; 

}

Offline andreyxvo  
#17 Оставлено : 17 апреля 2012 г. 14:33:59(UTC)
andreyxvo

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

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

Сертификаты
Вложение(я):
Andrey.p7b (1kb) загружен 8 раз(а).
Андрей.pfx (2kb) загружен 7 раз(а).
Пользователь andreyxvo прикрепил следующие файлы:
Безымянный.JPG (31kb) загружен 260 раз(а).
1.JPG (31kb) загружен 264 раз(а).
сертификаты.JPG (42kb) загружен 259 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline andreyxvo  
#18 Оставлено : 18 апреля 2012 г. 18:22:30(UTC)
andreyxvo

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

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

Вроде решил.
CertFindCertificateInStore(...CERT_FIND_SUBJECT_STR_A, L"Андрей" ,NULL))) Использую CERT_FIND_SUBJECT_STR_A, а проект в кодировке мультибайт. Поменял на CERT_FIND_SUBJECT_STR все заработало. Пока заработало.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.