| ||||
| ||||
Получаю точки распространения так: 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); И всегда, сколько бы не было точек распространения в сертификате, находится лишь одна, самая первая. Почему так происходит? Как исправить выше приведенный код? | ||||
Ответы: | ||||
| ||||
Дополнение: pCrlDistPoints = &pCrlDistPointsInfo->rgDistPoint[0]; читать как pCrlDistPoints = &pCrlDistPointsInfo->rgDistPoint[i]; | ||||
| ||||
Причем, в памяти другие точки распространения есть, но... Стандартная функция их не находит:(. | ||||
| ||||
А в сертификате их несколько? Можно на него взглянуть? | ||||
| ||||
Да, несколько. Куда выслать? | ||||
| ||||
Да прям здесь выкладывайте | ||||
| ||||
-----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----- | ||||
| ||||
В том сертификате что Вы выложили 1 точка распространения. Так что все правильно. | ||||
| ||||
Как это одна? [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 | ||||
| ||||
Так и есть. 1 точка с 3мя разными именами. | ||||
| ||||
Проблема в терминологии появилась... Как же тогда получить все имена точки доступа? И какой смысл в одной точки доступа с разными именами? Я посмотрел на вашем сайте документацию со сылкой на ietf.org, но ничего подходящего там не нашел. | ||||
| ||||
Перебрать все элементы массива pCrlDistPoints->DistPointName.FullName.rgAltEntry. Если физически точка доступа одна, но к ней разные способы доступа - например в локальной сети по http и как к расшаренному файлу - почему бы не сделать несколько имен? | ||||
| ||||
А если физически тоек CDP две, или три? И каждое имя указывает на отдельную точку CDP? | ||||
| ||||
Тогда перебрать все элементы массива pCrlDistPointsInfo->rgDistPoint. | ||||
| ||||
В смысле если это: ------------------------------------------ [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 с одним именем? И какая вообще разница? | ||||
| ||||
Заполнить нужным образом структуру CRL_DIST_POINTS_INFO и добавить ее в сертификат. С точки зрения правильных приложений разницы быть не должно, 3 точки каждая со своим именем или 1, но с 3мя. | ||||
| ||||
Еще пара вопросов: 1. Получается что даже если точка одна, имени три, и каждое из трех имен указывает на отдельную физическую машину, приложению должно быть все-равно, правильно? 2. Каким образом заполнить структуру CRL_DIST_POINTS_INFO и добавить ее в сертификат на примере КрипоПро УЦ 1.4? | ||||
| ||||
1. правильно 2. сделать свой модуль политики, КриптоПро УЦ тут непричем | ||||