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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Konst_Tomsk  
#1 Оставлено : 16 сентября 2013 г. 11:50:37(UTC)
Konst_Tomsk

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.06.2013(UTC)
Сообщений: 4
Российская Федерация
Откуда: Томск

Сказал(а) «Спасибо»: 1 раз
Добрый день, уважаемые Коллеги!
Пытаюсь в нижеследующей программе осуществить поиск сертификата по серийному номеру, не получается. Может кто-нибудь ответит, что здесь не так?
Цитата:
#include "stdafx.h"
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#pragma comment (lib, "crypt32.lib")


BYTE ValueHex(char ch) // преобразует символ в число, соответсвующее этому символу
{
if (ch <= '9')
return (ch-'0');
else
return (ch-'a'+10);
}

int _tmain(int argc, _TCHAR* argv[])
{
char SerialNumber[] = "2b132fc70000000003b5"; //серийный номер сертификата, по которому осуществляется поиск
HCERTSTORE hSystemStore;
PCCERT_CONTEXT pDesiredCert = NULL;
if (!(hSystemStore=CertOpenSystemStore( 0, L"MY")))
{
return 0;
}
CERT_INFO pvFindPara;
pvFindPara.SerialNumber.cbData = strlen(SerialNumber)/2;
pvFindPara.SerialNumber.pbData = (BYTE*)malloc(pvFindPara.SerialNumber.cbData);

BYTE* P = pvFindPara.SerialNumber.pbData;
for (int i = strlen(SerialNumber); i>0; i = i - 2)
{
*P = ValueHex(SerialNumber[i-2])*16 + ValueHex(SerialNumber[i-1]);
P = P + 1;
}

CertStrToName(X509_ASN_ENCODING,
_T("CN=ТУСУР"),
CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG,
NULL,
NULL,
&(pvFindPara.Issuer.cbData),
NULL);
pvFindPara.Issuer.pbData = (BYTE*)malloc(pvFindPara.Issuer.cbData);
CertStrToName(X509_ASN_ENCODING,
_T("CN=ТУСУР"),
CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG,
NULL,pvFindPara.Issuer.pbData,
&(pvFindPara.Issuer.cbData),
NULL);

if(pDesiredCert=CertFindCertificateInStore(hSystemStore,
X509_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_CERT,
&pvFindPara,
NULL))
{
printf("The desired certificate was found. \n");
}
free(pvFindPara.SerialNumber.pbData);
free(pvFindPara.Issuer.pbData);
return 0;
}
Offline Максим Коллегин  
#2 Оставлено : 17 сентября 2013 г. 1:20:13(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 32 раз
Поблагодарили: 706 раз в 614 постах
А без серийного номера ищет? Зачем его переворачиваете?
Знания в базе знаний, поддержка в техподдержке
Offline Konst_Tomsk  
#3 Оставлено : 17 сентября 2013 г. 6:14:47(UTC)
Konst_Tomsk

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.06.2013(UTC)
Сообщений: 4
Российская Федерация
Откуда: Томск

Сказал(а) «Спасибо»: 1 раз
Автор: maxdm Перейти к цитате
А без серийного номера ищет?

Если запускать функцию поиска CertFindCertificateInStore с типом поиска CERT_FIND_SUBJECT_STR, то сертификат находится без проблем, например по имени владельца сертификата или электронной почте. Но нужно именно осуществить поиск по серийному номеру.

Автор: maxdm Перейти к цитате
Зачем его переворачиваете?

Согласно описанию структуры CERT_INFO ссылка на MSDN в поле SerialNumber младший байт является нулевой байт члена pbData, а самый старший байт является последним байтом pbData.
Цитата:
SerialNumber
A BLOB that contains the serial number of a certificate. The least significant byte is the zero byte of the pbData member of SerialNumber. The index for the last byte of pbData, is one less than the value of the cbData member of SerialNumber. The most significant byte is the last byte of pbData. Leading 0x00 or 0xFF bytes are removed. For more information, see CertCompareIntegerBlob.

Отредактировано пользователем 17 сентября 2013 г. 6:16:54(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#4 Оставлено : 17 сентября 2013 г. 9:22:49(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
"CN=ТУСУР"

Это полное имя издателя?
Если передать в поиск CERT_INFO от существующего сертификата - ищется?
Техническую поддержку оказываем тут
Наша база знаний
Offline Konst_Tomsk  
#5 Оставлено : 17 сентября 2013 г. 13:29:53(UTC)
Konst_Tomsk

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.06.2013(UTC)
Сообщений: 4
Российская Федерация
Откуда: Томск

Сказал(а) «Спасибо»: 1 раз
Автор: Kirill Sobolev Перейти к цитате
Цитата:
"CN=ТУСУР"

Это полное имя издателя?


Вроде, да. На всякий случай прикладываю сертификат, который необходимо найти, в BASE64.
Цитата:
-----BEGIN CERTIFICATE-----
MIIIZzCCCBagAwIBAgIKKxMvxwAAAAADtTAIBgYqhQMCAgMwggEVMRowGAYIKoUD
A4EDAQESDDAwNzAyMTAwMDA0MzEYMBYGBSqFA2QBEg0xMDI3MDAwODY3MDY4MT0w
OwYDVQQLDDTQo9C00L7RgdGC0L7QstC10YDRj9GO0YnQuNC5INCm0LXQvdGC0YAg
0KHQuNCx0LjRgNC4MRMwEQYDVQQKDArQotCj0KHQo9CgMSMwIQYDVQQJDBrQv9GA
LiDQm9C10L3QuNC90LAsINC0LiA0MDEXMBUGA1UEBwwO0LMuINCi0L7QvNGB0Lox
KTAnBgNVBAgMIDcwINCi0L7QvNGB0LrQsNGPINC+0LHQu9Cw0YHRgtGMMQswCQYD
VQQGEwJSVTETMBEGA1UEAwwK0KLQo9Ch0KPQoDAeFw0xMzA2MjEwNDUzMDBaFw0x
NDA2MjEwNTAyMDBaMIIB0zEWMBQGBSqFA2QDEgswMzM0MjQzNzkyNjEaMBgGCCqF
AwOBAwEBEgw3MDE3MDU1MzMzNTExKjAoBgkqhkiG9w0BCQEWG3BmckBuYWxvZy5z
ZWN1cml0eS50b21zay5ydTELMAkGA1UEBhMCUlUxJzAlBgNVBAgeHgQiBD4EPARB
BDoEMARPACAEPgQxBDsEMARBBEIETDEZMBcGA1UEBx4QBDMALgAgBCIEPgQ8BEEE
OjETMBEGA1UECh4KBCIEIwQhBCMEIDFHMEUGA1UEAx4+BB8EQAQwBEEEOgRDBEAE
OAQ9ACAEEwQ1BD4EQAQzBDgEOQAgBBAEOwQ1BDoEQQQwBD0ENARABD4EMgQ4BEcx
JTAjBgNVBAkeHAQ/BEAALgAgBBsENQQ9BDgEPQQwACwAIAA0ADAxSTBHBgNVBAwe
QAQgBEMEOgQ+BDIEPgQ0BDgEQgQ1BDsETAAgBEIENQRFBD0EOARHBDUEQQQ6BD4E
MwQ+ACAEPgRCBDQENQQ7BDAxMzAxBgNVBCoeKgQTBDUEPgRABDMEOAQ5ACAEEAQ7
BDUEOgRBBDAEPQQ0BEAEPgQyBDgERzEbMBkGA1UEBB4SBB8EQAQwBEEEOgRDBEAE
OAQ9MGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQN03X19NIU6U
kGLSBsd+3isoJ+OMmjLpG+BQ6hK2F6yziyGVzt5hpAOBETbxULNc+WF0pd1+VUyx
rcYeJXxw+B+jggSCMIIEfjAOBgNVHQ8BAf8EBAMCBPAwMgYDVR0lBCswKQYIKwYB
BQUHAwQGCiqFAwMTAgMBAwIGByqFAwICIgYGCCsGAQUFBwMCMB0GA1UdDgQWBBS1
0KOE4vwVj6WcaLU+Kz9HEEtwTTCCAVYGA1UdIwSCAU0wggFJgBQgjcFkUhQDkQui
uFHx4GqGa3vf76GCAR2kggEZMIIBFTEaMBgGCCqFAwOBAwEBEgwwMDcwMjEwMDAw
NDMxGDAWBgUqhQNkARINMTAyNzAwMDg2NzA2ODE9MDsGA1UECww00KPQtNC+0YHR
gtC+0LLQtdGA0Y/RjtGJ0LjQuSDQptC10L3RgtGAINCh0LjQsdC40YDQuDETMBEG
A1UECgwK0KLQo9Ch0KPQoDEjMCEGA1UECQwa0L/RgC4g0JvQtdC90LjQvdCwLCDQ
tC4gNDAxFzAVBgNVBAcMDtCzLiDQotC+0LzRgdC6MSkwJwYDVQQIDCA3MCDQotC+
0LzRgdC60LDRjyDQvtCx0LvQsNGB0YLRjDELMAkGA1UEBhMCUlUxEzARBgNVBAMM
CtCi0KPQodCj0KCCEDdUljKLFLGxTDL8sGkE9/gwZgYDVR0fBF8wXTAsoCqgKIYm
aHR0cDovL3d3dy51ZGNzLnJ1L2NlcnRzcnYvc2liZXJpYS5jcmwwLaAroCmGJ2h0
dHA6Ly93d3cyLnVkY3MucnUvY2VydHNydi9zaWJlcmlhLmNybDCBiwYIKwYBBQUH
AQEEfzB9MDwGCCsGAQUFBzAChjBodHRwOi8vd3d3LnVkY3MucnUvY2VydHNydi9x
dWFsaWZpZWRfc2liZXJpYS5jZXIwPQYIKwYBBQUHMAKGMWh0dHA6Ly93d3cyLnVk
Y3MucnUvY2VydHNydi9xdWFsaWZpZWRfc2liZXJpYS5jZXIwKwYDVR0QBCQwIoAP
MjAxMzA2MjEwNDUzMDBagQ8yMDE0MDYyMTA0NTMwMFowNgYFKoUDZG8ELQwrItCa
0YDQuNC/0YLQvtCf0YDQviBDU1AiICjQstC10YDRgdC40Y8gMy42KTCCAUMGBSqF
A2RwBIIBODCCATQMNNCh0JrQl9CYICLQmtGA0LjQv9GC0L7Qn9GA0L4gQ1NQIiAo
0LLQtdGA0YHQuNGPIDMuNikMWtCf0JDQmiAi0KPQtNC+0YHRgtC+0LLQtdGA0Y/R
jtGJ0LjQuSDRhtC10L3RgtGAICLQmtGA0LjQv9GC0L7Qn9GA0L4g0KPQpiIg0LLQ
tdGA0YHQuNC4IDEuNQxP0KHQtdGA0YLQuNGE0LjQutCw0YIg0YHQvtC+0YLQstC1
0YLRgdGC0LLQuNGPIOKEliDQodCkLzEyMS0xODU5INC+0YIgMTcuMDYuMjAxMgxP
0KHQtdGA0YLQuNGE0LjQutCw0YIg0YHQvtC+0YLQstC10YLRgdGC0LLQuNGPIOKE
liDQodCkLzEyOC0xODIyINC+0YIgMDEuMDYuMjAxMjAdBgNVHSAEFjAUMAgGBiqF
A2RxATAIBgYqhQNkcQIwCAYGKoUDAgIDA0EAVrdBMe1yqrI2ZF4UGZfKwxC8s80q
lBVsy2hprbtaP/vLZbeWggTvhyLws0vlQxZ6ZdDRrlsTW5vjR93HEoBz9w==
-----END CERTIFICATE-----


По нему можно проверить.

Автор: Kirill Sobolev Перейти к цитате
Если передать в поиск CERT_INFO от существующего сертификата - ищется?

Да, ищется. Поиск осуществлял таким образом:
Код:

       PCCERT_CONTEXT  pDesiredCert = NULL, pDesiredCert2 = NULL;
       if(pDesiredCert=CertFindCertificateInStore(hSystemStore,
											   X509_ASN_ENCODING,
											   0,
											   CERT_FIND_SUBJECT_STR,
											   L"pfr@nalog.security.tomsk.ru",
											   NULL))                     
	{                                 
		printf("The desired certificate was found. \n");
	}
   
	if(pDesiredCert2=CertFindCertificateInStore(hSystemStore,
											   X509_ASN_ENCODING,
											   0,
											   CERT_FIND_SUBJECT_CERT,
											   pDesiredCert->pCertInfo,
											   NULL))                     
	{                                 
		printf("The desired certificate was found. \n");
	}
Offline Kirill Sobolev  
#6 Оставлено : 17 сентября 2013 г. 16:48:01(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Полное имя издателя в выложенном сертификате :
CN = ТУСУР
C = RU
S = 70 Томская область
L = г. Томск
STREET = пр. Ленина, д. 40
O = ТУСУР
OU = Удостоверяющий Центр Сибири
ОГРН = 1027000867068
ИНН = 007021000043
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
Konst_Tomsk оставлено 18.09.2013(UTC)
Offline Konst_Tomsk  
#7 Оставлено : 18 сентября 2013 г. 6:10:08(UTC)
Konst_Tomsk

Статус: Новичок

Группы: Участники
Зарегистрирован: 14.06.2013(UTC)
Сообщений: 4
Российская Федерация
Откуда: Томск

Сказал(а) «Спасибо»: 1 раз
Автор: Kirill Sobolev Перейти к цитате
Полное имя издателя в выложенном сертификате :
CN = ТУСУР
C = RU
S = 70 Томская область
L = г. Томск
STREET = пр. Ленина, д. 40
O = ТУСУР
OU = Удостоверяющий Центр Сибири
ОГРН = 1027000867068
ИНН = 007021000043


Заменил издателя на полное имя, все заработало. Спасибо, Кирилл, большое!
Offline mtv06  
#8 Оставлено : 12 апреля 2018 г. 17:48:22(UTC)
mtv06

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

Группы: Участники
Зарегистрирован: 06.12.2017(UTC)
Сообщений: 43
Российская Федерация
Откуда: Карелия

Здравствуйте! Сделал, как Konst_Tomsk. Но не работает, не находит сертификат((((

Цитата:
#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <TCHAR.H>
//#pragma comment (lib, "crypt32.lib")


BYTE ValueHex(char ch) // преобразует символ в число, соответсвующее этому символу
{
if (ch <= '9')
return (ch - '0');
else
return (ch - 'a' + 10);
}

int _tmain(int argc, _TCHAR* argv[])
{
char SerialNumber[] = "00af63e07ac40cc980e811bd265789aa30"; //серийный номер сертификата, по которому осуществляется поиск
HCERTSTORE hSystemStore;
PCCERT_CONTEXT pDesiredCert = NULL;
if (!(hSystemStore = CertOpenSystemStore(0, L"MY")))
{
return 0;
}
CERT_INFO pvFindPara;
pvFindPara.SerialNumber.cbData = strlen(SerialNumber) / 2;
pvFindPara.SerialNumber.pbData = (BYTE*)malloc(pvFindPara.SerialNumber.cbData);

BYTE* P = pvFindPara.SerialNumber.pbData;
for (int i = strlen(SerialNumber); i>0; i = i - 2)
{
*P = ValueHex(SerialNumber[i - 2]) * 16 + ValueHex(SerialNumber[i - 1]);
P = P + 1;
}

CertStrToName(X509_ASN_ENCODING, _T("CN = АО \"ПФ \"СКБ Контур\" \
O = АО \"ПФ \"СКБ Контур\" \
OU = Удостоверяющий центр \
STREET = Пр.Космонавтов д. 56 \
L = Екатеринбург \
S = 66 Свердловская область \
C = RU \
ИНН = 006663003127 \
ОГРН = 1026605606620 \
E = ca@skbkontur.ru"), CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG, NULL, NULL, &(pvFindPara.Issuer.cbData), NULL);
pvFindPara.Issuer.pbData = (BYTE*)malloc(pvFindPara.Issuer.cbData);

CertStrToName(X509_ASN_ENCODING, _T("CN = АО \"ПФ \"СКБ Контур\" \
O = АО \"ПФ \"СКБ Контур\" \
OU = Удостоверяющий центр \
STREET = Пр.Космонавтов д. 56 \
L = Екатеринбург \
S = 66 Свердловская область \
C = RU \
ИНН = 006663003127 \
ОГРН = 1026605606620 \
E = ca@skbkontur.ru"), CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG, NULL, pvFindPara.Issuer.pbData, &(pvFindPara.Issuer.cbData), NULL);

if (pDesiredCert = CertFindCertificateInStore(hSystemStore,
X509_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_CERT,
&pvFindPara,
NULL))
{
printf("The desired certificate was found. \n");
}
{
printf("The desired certificate not found. \n");
}
system("pause");
free(pvFindPara.SerialNumber.pbData);
free(pvFindPara.Issuer.pbData);
return 0;
}


Где косяк?

Отредактировано пользователем 12 апреля 2018 г. 17:49:02(UTC)  | Причина: Не указана

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