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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Treno1  
#1 Оставлено : 7 августа 2012 г. 15:23:19(UTC)
Treno1

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

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

Добрый день

Сделал функцию выводящую на экран\в файл имена сертификатов и их отпечатки.

Код:
if ( !( hCertStore = CertOpenStore(
			   CERT_STORE_PROV_SYSTEM,
			   0,
			   NULL,
			   CERT_SYSTEM_STORE_CURRENT_USER,
			   lpszStoreSubject)))
	{
		MyHandleError(TEXT("The MY store could not be opened."));
		goto quit_list;
	}else printf("Store opened\n\n");

	if(outfile){
		outfile_f = fopen(outfile, "w");
		if(!outfile_f) {
			return(0);
		}
	}

	while(pCertContext= CertEnumCertificatesInStore(
      hCertStore,
      pCertContext)) // on the first call to the function,
                     // this parameter is NULL 
                     // on all subsequent calls, 
                     // this parameter is the last pointer 
                     // returned by the function
	{
		cbDecoded = 256;
		if(!(pbDecoded = (BYTE*)malloc(cbDecoded)))
		{
			MyHandleError("Decode buffer memory allocation failed.");
			goto quit_list;
		}
		if(!(CertGetNameString(
			pCertContext,
			CERT_NAME_RDN_TYPE,
			0,
			NULL,
			(LPTSTR)pbDecoded,
			cbDecoded)))
		{
			MyHandleError("Can`t find cert name.");
			goto quit_list;
		}
		else {
			if(outfile)
				fprintf (outfile_f, "CertName: \n%s\n\n",pbDecoded);
			else
				printf("%s\n\n",pbDecoded);
			if(!(CertGetCertificateContextProperty(
				pCertContext,
				CERT_HASH_PROP_ID,
				NULL,
				&cbHash)))
			{
				MyHandleError("The first hash calculate pass failed.");
				goto quit_list;
			}
			if(!(pbHash = (BYTE*)malloc(cbHash)))
			{
				 MyHandleError("Hash buffer memory allocation failed.");
				 goto quit_list;
			}
			if(!(CertGetCertificateContextProperty(
				pCertContext,
				CERT_HASH_PROP_ID,
				pbHash,
				&cbHash)))
			{
				MyHandleError("The second hash calculate pass failed.");
				goto quit_list;
			}
			else{
				char hex[40];
				int i;
				strncpy(hex,bytesToHex(pbHash),40);
				if(outfile){
					fprintf (outfile_f, "FingerPrint: ");
					for (i=0;i<40;i++){
						fprintf (outfile_f, "%c",hex[i]);
						if((i+1)%2==0)
							fprintf (outfile_f, " ");
					}
				fprintf (outfile_f, "\n\n");
				}else{
					for (i=0;i<40;i++){
						printf("%c",hex[i]);
						if((i+1)%2==0)
							printf(" ");
					}
				printf("\n\n");
				}
			}
		}
	}


Проблемы две.
1: Когда мы проходим по хранилищу ROOT хеш некоторых сертификатов не 40 символов а 10 или 20.
Пример :Microsoft Root Certificate Authority cd d4 ee ae 60.
По коду пробежал , и почему-то мне CertGetCertificateContextProperty возвращает 5 символов, а не 20.
Вот функция конверта Hex to Byte:
Код:
char* bytesToHex(BYTE* raw) {
	char *kDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a",
      "b", "c", "d", "e", "f" };
	int length = strlen((char*)raw);
	char *hex;
	int value,highIndex,lowIndex,i;
	hex = (char*)malloc(length*2);
	for (i = 0; i < length; i++) {
		value = (raw[i] + 256) % 256;
		highIndex = value >> 4;
		lowIndex = value & 0x0f;
		if(i==0)
			strcpy(hex,kDigits[highIndex]);
		else
			strcat(hex,kDigits[highIndex]);
		strcat(hex,kDigits[lowIndex]);
	}
	return (char*)hex;
}

Что неправильно?

2: CertGetNameString возвращает что-то вроде:

Microsoft Root Certificate Authority
microsoft
com

А хотелось бы :CA=Microsoft Root Certificate Authority,C=microsoft и т.д.
Можно это както получить через cryptoApi?
Offline Treno1  
#2 Оставлено : 7 августа 2012 г. 15:29:42(UTC)
Treno1

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

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

1-ое решилось путём замены самописной функции Hex to Byte на CryptBinaryToString
Offline Андрей Писарев  
#3 Оставлено : 7 августа 2012 г. 15:33:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
CertGetNameString( .. dwType ...


dwType:
CERT_SIMPLE_NAME_STR = 1;
CERT_OID_NAME_STR = 2;
CERT_X500_NAME_STR = 3; = полные сведения
Техническую поддержку оказываем тут
Наша база знаний
Offline Treno1  
#4 Оставлено : 7 августа 2012 г. 15:58:43(UTC)
Treno1

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

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

com, microsoft, Microsoft Root Certificate Authority вывел CERT_OID_NAME_STR
Microsoft Root Certificate Authority вывел CERT_X500_NAME_STR

А так чтобы автоматически добавлялись строки типо СА= и т.д. не получаеться
Offline Андрей Писарев  
#5 Оставлено : 7 августа 2012 г. 16:01:09(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Treno1 написал:
com, microsoft, Microsoft Root Certificate Authority вывел CERT_OID_NAME_STR
Microsoft Root Certificate Authority вывел CERT_X500_NAME_STR

А так чтобы автоматически добавлялись строки типо СА= и т.д. не получаеться


сообщи срок действия этого сертификата\его серийный ... чтоб найти у себя в root или выложи здесь
проверю у себя
Техническую поддержку оказываем тут
Наша база знаний
Offline Treno1  
#6 Оставлено : 7 августа 2012 г. 16:08:08(UTC)
Treno1

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

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

А это у меня со всеми сертификатами.
Offline Treno1  
#7 Оставлено : 7 августа 2012 г. 16:10:02(UTC)
Treno1

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

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

Я нашёл как вычленять только то , что нужно:
Код:
CertGetNameString(
			pCertContext,
			CERT_X500_NAME_STR ,
			0,
			szOID,
			(LPTSTR)pbDecoded,
			cbDecoded)

Где вместо szOID:
Код:
//  Key         Object Identifier               RDN Value Type(s)
//  ---         -----------------               -----------------
//  CN          szOID_COMMON_NAME               Printable, Unicode
//  L           szOID_LOCALITY_NAME             Printable, Unicode
//  O           szOID_ORGANIZATION_NAME         Printable, Unicode
//  OU          szOID_ORGANIZATIONAL_UNIT_NAME  Printable, Unicode
//  E           szOID_RSA_emailAddr             Only IA5
//  Email       szOID_RSA_emailAddr             Only IA5
//  C           szOID_COUNTRY_NAME              Only Printable
//  S           szOID_STATE_OR_PROVINCE_NAME    Printable, Unicode
//  ST          szOID_STATE_OR_PROVINCE_NAME    Printable, Unicode
//  STREET      szOID_STREET_ADDRESS            Printable, Unicode
//  T           szOID_TITLE                     Printable, Unicode
//  Title       szOID_TITLE                     Printable, Unicode
//  G           szOID_GIVEN_NAME                Printable, Unicode
//  GN          szOID_GIVEN_NAME                Printable, Unicode
//  GivenName   szOID_GIVEN_NAME                Printable, Unicode
//  I           szOID_INITIALS                  Printable, Unicode
//  Initials    szOID_INITIALS                  Printable, Unicode
//  SN          szOID_SUR_NAME                  Printable, Unicode
//  DC          szOID_DOMAIN_COMPONENT          IA5, UTF8
//  SERIALNUMBER szOID_DEVICE_SERIAL_NUMBER     Only Printable


Просто по мне неправильно как-то ручками ключи дописывать. Хотелось бы автоматически
Offline Андрей Писарев  
#8 Оставлено : 7 августа 2012 г. 16:15:01(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
у меня сразу выходит нужная строка... полные сведения


CertGetNameString(pCertContext, CERT_NAME_RDN_TYPE, 0, CERT_X500_NAME_STR, nil, Size);
выделение памяти..
CertGetNameString(pCertContext, CERT_NAME_RDN_TYPE, 0, CERT_X500_NAME_STR, Result, Size);


на примере ГУЦ
Владелец(полные данные): INN=007710474375, OGRN=1047702026701, E=dit --- minsvyaz.ru, STREET=125375 г. Москва ул. Тверская д.7, O=Минкомсвязь России, L=Москва, S=77 г. Москва, C=RU, CN=УЦ 1 ИС ГУЦ

Отредактировано пользователем 7 августа 2012 г. 16:22:09(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 7 августа 2012 г. 16:22:40(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
типа: ... "код"

Код:

void printCert(PCCERT_CONTEXT pCert, int dwIndex)
{
   DWORD dwStrType = CERT_X500_NAME_STR;
   DWORD dwCount = CertGetNameString(  pCert,
                                       CERT_NAME_RDN_TYPE,
                                       0,
                                       &dwStrType,
                                       NULL,
                                       0);
   if (dwCount)
   {
      LPTSTR szSubjectRDN = (LPTSTR) LocalAlloc(0, dwCount * sizeof(TCHAR));
      dwCount = CertGetNameString(pCert,
         CERT_NAME_RDN_TYPE,
         0,
         &dwStrType,
         szSubjectRDN,
         dwCount);
      if (dwCount)
      {
         _tprintf(_T("%d - Certificate Subject = %s\n"), dwIndex, szSubjectRDN);
      }

      LocalFree(szSubjectRDN);
   }   
}
Техническую поддержку оказываем тут
Наша база знаний
Offline Treno1  
#10 Оставлено : 7 августа 2012 г. 16:36:10(UTC)
Treno1

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

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

Код:
CertGetNameString(
			pCertContext,
			CERT_NAME_RDN_TYPE ,
			0,
			CERT_X500_NAME_STR,
			(LPTSTR)pbDecoded,
			cbDecoded)


Падает : Необработанное исключение в "0x777215de" в "pkcs7_test.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000003".

На CERT_X500_NAME_STR ругаеться что int несовместим с void*. Если написать "3" ,то выводит "com, microsoft, Microsoft Root Certificate Authority"

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