23.03.2007 10:51:55Указатель на CRL Ответов: 31
Волков
Хочу получить указатель на CRL следующим образом:
PCCRL_CONTEXT pCRLContext=0;
pCRLContext=CertGetCRLFromStore(
hSystemStore,
NUUL,
NULL,
CERT_STORE_BASE_CRL_FLAG);
но компилятор говорит следующее:
[C++ Error] Unit1.cpp(40): E2034 Cannot convert 'int' to 'unsigned long *'
[C++ Error] Unit1.cpp(40): E2342 Type mismatch in parameter 'pdwFlags' (wanted 'unsigned long *', got 'int')
И что нужно указывать во втором параметре?
 
Ответы:
23.03.2007 11:03:08Kirill Sobolev
Ошибка не во втором а в четвером параметре.
Нужен указатель
Т.е. дб что-то типа

PCCRL_CONTEXT pCRLContext=0;
DWORD dwFlags=CERT_STORE_BASE_CRL_FLAG;
pCRLContext=CertGetCRLFromStore(
hSystemStore,
NUUL,
NULL,
&dwFlags);
23.03.2007 12:19:52Волков
Передал 4-ый параметр как ссылку, установил новые списки CRL, но все равно функция возвращает ошибку -2146885628. В чем может быть дело?
23.03.2007 13:46:43Kirill Sobolev
А у Вас ХР?
23.03.2007 13:52:04Волков
Да XP.
23.03.2007 14:25:17Kirill Sobolev
Это ошибка "Объект или свойство не найдено". Не находит CRL по какой-то причине
23.03.2007 14:30:20Волков
А что надо писать во втором параметре?
23.03.2007 16:30:53Kirill Sobolev
контекст сертификата издателя
26.03.2007 6:00:30Волков
Он получается функцией CertFindCertificateInStore? или есть какя-то другая, для этих целей?
26.03.2007 12:24:59Kirill Sobolev
Зависит от того, откуда и как Вы его получаете
Если поиском в хранилище то да, CertFindCertificateInStore вполне подойдет
29.03.2007 10:53:19Волков
Вот так должен быть получен контекст CRL.
HCERTSTORE hStoreHandleCheck;
hStoreHandleCheck=CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY");

DWORD dwFlagsCheck=CERT_STORE_BASE_CRL_FLAG;
PCCRL_CONTEXT pCRLContext=0;
pCRLContext=CertGetCRLFromStore(
hStoreHandleCheck,
NULL,
NULL,
&dwFlagsCheck);
29.03.2007 10:58:58Волков
в предыдущем посте был вопрос
29.03.2007 11:08:47Kirill Sobolev
CRL как правило (и по умолчанию) ставятся в Промежуточные ЦС ("CA"), но никак не в Личные ("MY"). Вы уверены, что он у Вас именно в Личных лежит?
29.03.2007 12:04:02Волков
Он у меня лежит в Промужуточные центры сертификации\список отзыва сертификатов. Тогда вместо "MY", надо "CA".
29.03.2007 13:16:37Волков
Спасибо помогло. Аесли у меня несколько списков отозванных сертификатов, то какой будет выбираться функцией?
29.03.2007 13:26:06Kirill Sobolev
Неизвестно. Любой может быть выбран.
29.03.2007 13:34:18Волков
А как тогда поступить? если есть несколько CA.
29.03.2007 15:02:58Kirill Sobolev
Ищите тот, который выпущен нужным Вам СА.
30.03.2007 9:30:07Волковй
Можно как-нибудь из CRL вытащить адрес до него на сервере, ну чтобы скажем если пользователь хочет воспользоваться сертификатом, я проверяю его на отозванность, если оказывается так что CRL просрочен то сразу открывался бы обозреватель на нужной странице?
30.03.2007 10:20:55Kirill Sobolev
Если в CRL есть расширение CDP (обычно есть), то из него можно вытащить
03.07.2007 10:35:34Волков
Требуется найти CRL выпущенный CA контекст сертификата которого я получаю следующим образом:
pCaCert = CertFindCertificateInStore(
hStoreHandle,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
signerCA,
NULL);
где signerCA это указатель на буффер в котором содержиться имя УЦ, здесь все нормально. Далее хочу получить контекст CRL который лежит в локальном хранилище, в промежуточных центрах сертификации:
DWORD dwFlagsCheck=CERT_STORE_BASE_CRL_FLAG;
pCRLContext=CertGetCRLFromStore(
hStoreHandleCheck,
pCaCert,
NULL,
&dwFlagsCheck);
Но контекст CRL получить не удается, код ошибки 2148081668? В чем может быть дело?
04.07.2007 13:25:34Волков
в дополнение к предыдущему посту. Если в хранилище оставить всего один CRL то он обнаруживается функцией
pCRLContext=CertGetCRLFromStore(
hStoreHandleCheck,
NULL,//pCaCert,
NULL,
&dwFlagsCheck);
04.07.2007 15:57:42Kirill Sobolev
А действительно в хранилище лежить base CRL для этого ЦС?
05.07.2007 6:25:01Волков
А как получить base CRL? Я получал CRL через вэб интерфейс УЦ.
05.07.2007 11:45:40Kirill Sobolev
КриптоПро УЦ не работает с base/delta CRL.
Попробуйте с DWORD dwFlagsCheck=0
05.07.2007 12:19:33Волков
DWORD dwFlagsCheck=0 так тоже не получается. Может есть у кого рабочий пример?
05.07.2007 12:39:03Kirill Sobolev
Значит поиск не по тому сертификату ЦС
сам код то верный
Попробуйте проверить найденный CRL ОК сертификата ЦС по которому ищете
05.07.2007 13:14:05Волков
а что такое ОК?
05.07.2007 13:31:23Kirill Sobolev
открытый ключ
функция для проверки - CryptVerifyCertificateSignatureEx
05.07.2007 14:57:18Волков
Не могли бы вы пояснить что нужно передавать в следующих параметрах?
pvSubject
dwIssuerType
pvIssuer
05.07.2007 15:11:42Kirill Sobolev
pvSubject - pCRLContext
dwIssuerType - CRYPT_VERIFY_CERT_SIGN_ISSUER_CERT
pvIssuer - pCaCert
17.08.2007 17:19:42fjovevxxos
Hello! Good Site! Thanks you! dzqykktnvtzx