Найти CRls | |
---|---|
alex_lip Автор Сообщений: 74 Дата регистрации: 23.01.2006 |
Доброго времени суток.
Пытаюсь применить код
для этого использую
Куда смотреть? |
Re: Найти CRls | |
---|---|
PaulWist Сообщений: 14601 Дата регистрации: 01.04.2004 |
Посмотри forum.foxclub.ru
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Найти CRls | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
У списка отзыва есть только Issuer, и насколько я понимаю, простого АПИ для его извлечения нет - он там внутри структур спрятан...
А зачем это вообще понадобилось? Свой GUI управления сертификатами и всем прочим рисуешь? Если что, CertEnumCRLsInStore() возвращает указатель на CRL_CONTEXT, а не на CERT_CONTEXT (поэтому бессмысленно далее пользоваться функциями работы с CERT_CONTEXT). В этой структуре есть указатель на структуру CRL_INFO, в ней есть поле Issuer с указателем на BLOB с данными о CA выпустившим данный СОС, текст из которого по идее вынимает функция CertNameToStr()... ------------------ WBR, Igor |
Re: Найти CRls | |
---|---|
alex_lip Автор Сообщений: 74 Дата регистрации: 23.01.2006 |
Все правильно. Только у функций работы с сертификатами есть способ сразу в строку вытащить имя. А здесь я как раз с указателем на blob и потерялся. Мне издатель и нужен(issuer).
Я не знаю как на фоксе это сделать..... |
Re: Найти CRls | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Как-то так. Хотя всё одно не пойму на кой чёрт это может быть нужно в фоксовой программе
------------------ WBR, Igor |
Re: Найти CRls | |
---|---|
alex_lip Автор Сообщений: 74 Дата регистрации: 23.01.2006 |
Спасибо! Дело в том, что я в системе документооборота (на фоксе) проверяю наличие на компе корневого сертификата и списка отзывов, которые сам и выпускаю. Но расставляют эти сертификаты не я, а системщики. Которые иногда ленятся , иногда тупят. Надо контролировать ((
|
Re: Найти CRls | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Хммм если в этой системе ИСПОЛЬЗУЮТСЯ данные сертификаты, то по идее по возникновению ошибки при попытке подписать или проверить документ можно судить о том что "чего-то не хватает". Т.к. для правильного использования нужно:
- наличие всей цепочки сертификатов - и корневого, и промежуточного (если он есть, что как бы "хороший тон"), и собственно "пользовательского", используемого для подписи. - наличие актуальных COC для корневого и промежуточного сертификатов - у СОС тоже есть "время жизни", точнее период, после которого требуется этот список обновить. Кроме того есть подход вообще БЕЗ использования COC - с запросами текущего статуса сертификата у CA по протоколу OCSP. Он позволяет гораздо быстрее отзывать скомпрометированные сертификаты, и не требует муторного слежения за "актуальностью" СОС... ------------------ WBR, Igor |
Re: Найти CRls | |
---|---|
alex_lip Автор Сообщений: 74 Дата регистрации: 23.01.2006 |
Мне не нужны списки отзывов реальные. Я и так через программу контролирую пользователей. Crl - просто заглушка чтобы подпись была действительна(он просто должен быть) . Подпись не является юридически значимой. Она используется только внутри организации. Я использую open-ssl и сам генерю и корневой и сертификаты пользователей. Из фоксы внутри формы я запускаю Word, а там уже пользователь средствами word подписывает документ. Потом сохраняет в Oracle blob. И документ хранится подписанный. Просто пользователей уже больше тысячи. Поэтому нужно отслеживать, чтобы у всех был установлен корневой сертификат и список отзывов для того чтобы при просмотре подпись была действительна.
|
Re: Найти CRls | |
---|---|
alex_lip Автор Сообщений: 74 Дата регистрации: 23.01.2006 |
Кстати спасибо за наводку про OCSP. Это на будущее. Сейчас просто не хватает возможности все охватить. У меня полтора разработчика и полтора человека на поддержке.
|
Re: Найти CRls | |
---|---|
rvc44 Сообщений: 2211 Откуда: Тамбов Дата регистрации: 06.12.2005 |
Интересно, зачем при получении значения pCRLInfo в приведенном выше примере устанавливать старший бит путём добавления 2^31? Традиционно, если старший бит равен 1, то число считается отрицательным, только, если оно не определено как беззнаковое.
Ещё у меня какая-то засада приключилась с вызовом функции CryptoAPI CertFindExtension с параметром szOID_CRL_REASON_CODE для определения причины отзыва сертификата, при чтении информации из CRL, при передаче в нее параметров, предварительно полученных из структуры CRL_ENTRY. Почему-то эта функция у меня всегда возвращает ноль. При этом, информация о CRL Issuer и SerialNumber каждого из отозванных сертификатов у меня извлекается из загруженного CRL list вполне успешно на чистом фоксе. При получении SerialNumber, для его корректного отображения/сохранения приходится инвертировать порядок следования байт. Так что пока определяю только факт того, что сертификат отозван, без определения причины его отзыва, которую пока не удалось прочитать, что в принципе не критично. Возможно, кто-то из форумчан разобрался, как из VFP использовать функции CertFindExtension и CryptFormatObject для получения и отображения CRL Reason Code? И последнее: кто как обходит Proxy при автоматической загрузке CRL из адреса(ов) CDP, указанных в сертификате? Я получаю настройки Proxy из настроек браузера IE в реестре. Но бывают случаи, когда пользователи браузер IE вообще не используют, либо применяется автоматический сценарий настройки Proxy без указания его адреса в явном виде. Просто интересно, кто как решает данную проблему, чтобы не запрашивать настройку Proxy у пользователя вручную? |
Re: Найти CRls | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Потому что конвертация 4 байт в число выполняется фоксовой функцией CTOBIN, а она несколько своеобразна при работе с беззнаковыми целыми - ну точнее она не умеет с ними работать (считает все dword за знаковые, и может лишь знаковый бит инвертировать, что мало поможет в данном случае), вот и приходится шаманить, чтобы получить правильный адрес (который, конечно же, есть число беззнаковое ). ------------------ WBR, Igor |
Re: Найти CRls | |
---|---|
rvc44 Сообщений: 2211 Откуда: Тамбов Дата регистрации: 06.12.2005 |
Посмотрел сейчас еще раз свой код вызова CryptoAPI функции CertFindExtension с параметром szOID_CRL_REASON_CODE для определения причины отзыва сертификата. Оказывается, я сам себя ввел в заблуждение, поскольку это расширение не всегда присутствует! Ноль возвращается именно в тех случаях, когда указанное расширение отсутствует и ненулевое значение во всех остальных случаях. Таким образом, теперь осталось разобраться с параметрами функции CryptFormatObject и прикрутить её вызов, что постараюсь сделать в ближайшее время.
|
Re: Найти CRls | |
---|---|
rvc44 Сообщений: 2211 Откуда: Тамбов Дата регистрации: 06.12.2005 |
Спасибо за пояснение! Возьмем на вооружение данное полезное шаманство. Получается для CryptoAPI-функций при каждом CTOBIN можно использовать? Были случаи, когда отсутствие этой добавки приводили к неработоспособности кода?
|
Re: Найти CRls | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Без этой "добавки" код будет всегда некорректен Проявится это, конечно, лишь в случае если адрес окажется из верхнего диапазона памяти, т.е. будет больше чем 0x7fffffff
Это было не очень распространено в эпоху WinXP, т.к. 32 битная ОС при обычной клиентской установке резервировала верхнюю половину адресов под систему, и в принципе можно было применять CTOBIN(addr,"4RS"). Но в 64-битных системах (равно как и в некоторых "серверных" или "специальных" установках 32-битных систем - там есть специальный флажок управляющий этим поведением, в т.ч. даже в WinXP Prof он работает) 32-битный процесс уже может получить больше 2Гб памяти - до 3Гб в 32-битных системах и практически полный диапазон в 4Гб в 64-битных ОС. Правда ещё и сам процесс должен сообщить что он Large address aware, иначе система всё так же будет ограничивать его 2-мя ГБ "пользователькой" памяти. Я не думаю что фокс поддерживает этот режим, но всё равно мне кажется что правильнее кодировать "правильно", а не с оглядкой на некоторое ограничение, позволяющее в ряде случаев трактовать адрес как знаковое число ------------------ WBR, Igor |
Re: Найти CRls | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Не видел в диспетчере памяти обьема занимаемой памяти >= чем 2Г (видел, в VFP же, при явном занятии памяти через API, 1.7Г). И вообще, сам VFP повалится, если > 2г (задействовать 32й бит адреса в памяти), что-то было такое. Натыкался при разборе CSV-файла недействительных паспортов, 150млн записей, неслабый почин цифровизации нашего документооборота )
|
Re: Найти CRls | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Это не повод говнокодить
Указатели, сиречь адреса в памяти - это 32 разрядные БЕЗЗНАКОВЫЕ целые. Так их и следует трактовать. ------------------ WBR, Igor |
Re: Найти CRls | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Способ то давай, создать фоксовое Integer-число (чтобы его передать функции? зачем все это нужно?! параметры в АПИ все равно передаютмя как байты, можно передать любое значение сташего байта, и для этого не оьязателдьно использовать BINNOC и наоборотный его аналоu. Да, неудачный получился BINTOC
Доб. Так то просто, BITSET(0, 31), и то, за ним надо присматртивать. Исправлено 1 раз(а). Последнее : of63, 01.09.19 22:03 |
Re: Найти CRls | |
---|---|
rvc44 Сообщений: 2211 Откуда: Тамбов Дата регистрации: 06.12.2005 |
Теперь, добившись работы функции CertFindExtension с параметром szOID_CRL_REASON_CODE, столкнулся со следующей проблемой при вызове функции CryptFormatObject.
Описание данной функции в MSDN следующее:
Пробуем перевести описание функции на VFP:
В 6-м и 7-м параметрах pbEncoded и cbEncoded передаётся по частям BLOB-объект, предварительно полученный в структуре CERT_EXTENSION:
Возник вопрос, а какой истиный размер total этой структуры в байтах? Он составляет 13 или 16 байт? Элемент структуры BOOL fCritical кажется мне подозрительным! Тип BOOL занимает всего один байт, в чем легко можно убедиться:
Однако, во многих букварях написано, что если вы не упакуете структуру, она всегда будет иметь память, которая делится на размер слова (из-за выделения памяти). Вы упаковываете структуру, используя __attribute__(packed) в gcc, например. Упаковка структуры может уменьшить требуемую память, но почти наверняка замедлит выполнение. Поскольку в фоксе никто ничего не упаковывал, и с учетом информации от коллеги, который проверял в Delphi: 32 bit sizeof(pCertContext.pCertInfo.rgExtension^)=16 64 bit sizeof(pCertContext.pCertInfo.rgExtension^)=28 я уже начинаю сомневаться, что BYTE в структуре занимает 1 байт, а не 4, хотя логика подсказывает, что такого не должно быть. По сути, это и не важно! Важно, какое будет смещение в структуре CERT_EXTENSION у следующего за полем BOOL fCritical поля CRYPT_OBJID_BLOB Value? Будет ли это от начала структуры 6-й байт или 9-й? Ведь от этого зависит корректность передачи параметров в функцию CryptFormatObject. Пока делаю вот так:
В итоге, данный код даже не доходит до вывода сообщения "CryptFormatObject вернул 0". Всё наглухо умирает на первом вызове функции CryptFormatObject. Так тоже не работает:
Но вообще, это адский C++ interop, который трудно понять, не зная, как в C++ работают указатели, структуры и C-подобные массивы и как работает маршалон в interop. Исправлено 1 раз(а). Последнее : rvc44, 02.09.19 13:16 |
Re: Найти CRls | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Дело в другом. В Фоксе нет аналогов типов данных, и для каждого типа нужно писать свою обертку, если в этом есть смысл. Типов немало, они в фоксе не систематизированы, и в каждом случае результат добивается героической борьбой. Обычно эта проблема вскрывается при работе со структурами. ИК в каждом случае для конкретного типа в скрытой форме дает эти преобразования, и на этом строит свои теории. |
Re: Найти CRls | |
---|---|
rvc44 Сообщений: 2211 Откуда: Тамбов Дата регистрации: 06.12.2005 |
Кстати, помимо VFP, все эти знания как вручную работать с API и со структурами данных, могут пригодиться и на Python'е, где вместо CreateObject можно использовать Dispatch и вперёд!
Вот здесь есть пример: www.mpss-pdx.com
|
© 2000-2024 Fox Club  |