22.08.2006 19:03:53Получение списка CDP. Почему лишь один? Ответов: 17
Кирилл
Получаю точки распространения так:

PCERT_EXTENSION pCertExt = NULL;
PCRL_DIST_POINTS_INFO pCrlDistPointsInfo = NULL;
PCRL_DIST_POINT pCrlDistPoints = NULL;
DWORD pdwCrlDistPoints = sizeof(CRL_DIST_POINTS_INFO);



if (!(pCertExt = CertFindExtension(szOID_CRL_DIST_POINTS,
pSignerCert->pCertInfo->cExtension,
pSignerCert->pCertInfo->rgExtension)))
{
printf("Ошибка, нет CRL");
}

if (!CryptDecodeObjectEx(MY_ENCODING_TYPE,
X509_CRL_DIST_POINTS,
pCertExt->Value.pbData,
pCertExt->Value.cbData,
CRYPT_DECODE_ALLOC_FLAG,
(PCRYPT_DECODE_PARA)NULL,
&pCrlDistPointsInfo,
&pdwCrlDistPoints))
{
printf("Ошибка, не удалось получить CRL");
return ;
}

if (pCrlDistPointsInfo)
{

for (int i=0; i<pCrlDistPointsInfo->cDistPoint; i++)
{

pCrlDistPoints = &pCrlDistPointsInfo->rgDistPoint[0];
if (pCrlDistPoints)
{
wprintf(L"%s", pCrlDistPoints->DistPointName.FullName.rgAltEntry->pwszURL);
}
}

}

LocalFree(pCrlDistPoints);


И всегда, сколько бы не было точек распространения в сертификате, находится лишь одна, самая первая. Почему так происходит? Как исправить выше приведенный код?
 
Ответы:
22.08.2006 19:04:39Кирилл
Дополнение:
pCrlDistPoints = &pCrlDistPointsInfo->rgDistPoint[0]; читать как pCrlDistPoints = &pCrlDistPointsInfo->rgDistPoint[i];
22.08.2006 19:35:36Кирилл
Причем, в памяти другие точки распространения есть, но... Стандартная функция их не находит:(.
23.08.2006 9:30:17Kirill Sobolev
А в сертификате их несколько? Можно на него взглянуть?
23.08.2006 10:41:58Кирилл
Да, несколько. Куда выслать?
23.08.2006 13:44:06Kirill Sobolev
Да прям здесь выкладывайте
23.08.2006 13:50:10Кирилл
-----BEGIN CERTIFICATE-----
MIID4zCCA5CgAwIBAgIKYYzu2wAAAAAACjAKBgYqhQMCAgMFADCBujELMAkGA1UE
BhMCUlUxDzANBgNVBAcTBk1vc2NvdzElMCMGA1UEChMcdHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dDEoMCYGA1UECxMfdHR0dHR0dHR0dHR0dHR0dHR0dHQgRGVw
YXJ0bWVudDEoMCYGA1UEAxMfdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dDEfMB0GCSqGSIb3DQEJARYQY2FAdHQudHR0dHR0dC5ydTAeFw0wNjA3MDUxMjMy
MDBaFw0wNzA3MDUwOTQ4MDBaMGgxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Nj
b3cxJTAjBgNVBAoTHHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQxDTALBgNV
BAsTBE9aSVQxEjAQBgNVBAMTCVRlc3QgVXNlcjBjMBwGBiqFAwICEzASBgcqhQMC
AiQABgcqhQMCAh4BA0MABEBS/Aq8xVJocFfhG8gqk3Kw4koSAS+g/x2oq974TN9A
r/zp8cnxnLhjh5n2Wi3Q7koVF/Lauvbu3ZT0rsdm8F3ro4IBwzCCAb8wDgYDVR0P
AQH/BAQDAgTwMCYGA1UdJQQfMB0GByqFAwICIgYGCCsGAQUFBwMCBggrBgEFBQcD
BDAdBgNVHQ4EFgQUBXwZamwtPPU2IhKG4Y3FYomgD2gwHwYDVR0jBBgwFoAUBpXz
UcnznV/ApHab9A3YGWVySfkwgZIGA1UdHwSBijCBhzCBhKCBgaB/hidodHRwOi8v
d3d3LnR0LnR0dHR0dHQucnUvY2VydHNydi9jYS5jcmyGKGh0dHA6Ly9pbmZvLnR0
LnR0dHR0dHQucnUvY2VydHNydi9jYS5jcmyGKmh0dHA6Ly9zcnZjcnNiLnR0LnR0
dHR0dHQucnUvcmEvY2RwL2NhLmNybDCBrwYIKwYBBQUHAQEEgaIwgZ8wMwYIKwYB
BQUHMAKGJ2h0dHA6Ly93d3cudHQudHR0dHR0dC5ydS9jZXJ0c3J2L2NhLmNydDA0
BggrBgEFBQcwAoYoaHR0cDovL2luZm8udHQudHR0dHR0dC5ydS9jZXJ0c3J2L2Nh
LmNydDAyBggrBgEFBQcwAoYmaHR0cDovL3NydmNyc2IudHQudHR0dHR0dC5ydS9y
YS9jYS5jcnQwCgYGKoUDAgIDBQADQQBsIhLLPA3R5GaFzdDuzuQ/4IrRfooV3NYw
1EspcMkPdzmIbiMDYst+oVB/JPVl+Ab1gApddU68XnlzGyGFWcgy
-----END CERTIFICATE-----
23.08.2006 14:00:41Kirill Sobolev
В том сертификате что Вы выложили 1 точка распространения. Так что все правильно.
23.08.2006 14:47:27Кирилл
Как это одна?

[1]Точка распределения списка отзыва (CRL)
Имя точки распространения:
Полное имя:
URL=http://www.tt.ttttttt.ru/certsrv/ca.crl
URL=http://info.tt.ttttttt.ru/certsrv/ca.crl
URL=http://srvcrsb.tt.ttttttt.ru/ra/cdp/ca.crl
23.08.2006 15:03:31Kirill Sobolev
Так и есть.
1 точка с 3мя разными именами.
23.08.2006 15:13:15Кирилл
Проблема в терминологии появилась... Как же тогда получить все имена точки доступа? И какой смысл в одной точки доступа с разными именами? Я посмотрел на вашем сайте документацию со сылкой на ietf.org, но ничего подходящего там не нашел.
23.08.2006 16:49:39Kirill Sobolev
Перебрать все элементы массива pCrlDistPoints->DistPointName.FullName.rgAltEntry.
Если физически точка доступа одна, но к ней разные способы доступа - например в локальной сети по http и как к расшаренному файлу - почему бы не сделать несколько имен?
24.08.2006 9:47:29Иван
А если физически тоек CDP две, или три? И каждое имя указывает на отдельную точку CDP?
24.08.2006 10:16:06Kirill Sobolev
Тогда перебрать все элементы массива pCrlDistPointsInfo->rgDistPoint.
24.08.2006 10:23:42Иван
В смысле если это:
------------------------------------------
[1]Точка распределения списка отзыва (CRL)
Имя точки распространения:
Полное имя:
URL=http://www.tt.ttttttt.ru/certsrv/ca.crl
URL=http://info.tt.ttttttt.ru/certsrv/ca.crl
URL=http://srvcrsb.tt.ttttttt.ru/ra/cdp/ca.crl
-----------------------------------------------

одна точка распростанения с тремя разными именами, то как вставить в сертификат 3 разных точки CDP с одним именем? И какая вообще разница?
24.08.2006 10:56:15Kirill Sobolev
Заполнить нужным образом структуру CRL_DIST_POINTS_INFO и добавить ее в сертификат.
С точки зрения правильных приложений разницы быть не должно, 3 точки каждая со своим именем или 1, но с 3мя.
24.08.2006 11:42:10Иван
Еще пара вопросов:
1. Получается что даже если точка одна, имени три, и каждое из трех имен указывает на отдельную физическую машину, приложению должно быть все-равно, правильно?
2. Каким образом заполнить структуру CRL_DIST_POINTS_INFO и добавить ее в сертификат на примере КрипоПро УЦ 1.4?
24.08.2006 13:40:34Kirill Sobolev
1. правильно
2. сделать свой модуль политики, КриптоПро УЦ тут непричем