logo
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Den94  
#1 Оставлено : 12 октября 2017 г. 10:03:24(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Добрый день. Просмотрел несколько подобных тем на форуме, но не получается реализовать перечисление всех считывателей на Delphi. Возможно ли это? Использую Delphi XE2, модуль от JEDY JwaWinCrypt. При разных вариантах передачи в качестве dwParam неописанной в модуле PP_ENUMREADERS (114) и с разными комбинациями флагов возникает одна и та же ошибка: Указан неправильный тип.
Offline Андрей *  
#2 Оставлено : 12 октября 2017 г. 10:52:22(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Здравствуйте.


Да, возможно.

Показывайте код
Offline Den94  
#3 Оставлено : 12 октября 2017 г. 11:23:00(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Код:
function EnumReadersList(var List:TArray<string>):boolean;
var DataLen,hProv,Flag: Cardinal;
    Data:PByte;
    res:boolean;
    index:integer;
const
    PP_ENUMREADERS = 114;
begin
  SetLength(List,0);
  result:=CryptAcquireContext(hProv,nil,nil,PROV_RSA_FULL,0);
  if result then begin
     res:=CryptGetProvParam(hProv,PP_ENUMREADERS,nil,DataLen,CRYPT_FIRST OR 32); //Ошибка возникает здесь
     if res then begin
        GetMem(Data,DataLen);
        Flag:=CRYPT_FIRST;
        while CryptGetProvParam(hProv,PP_ENUMREADERS,Data,DataLen,Flag) do begin
              index:=length(List);
              SetLength(List,index+1);
              List[index]:=string(PChar(Data));

              Flag := CRYPT_NEXT;
        end;
        FreeMem(Data);
     end;
     CryptReleaseContext(hProv, 0);
  end;
end;
Offline Андрей *  
#4 Оставлено : 12 октября 2017 г. 12:04:48(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
А зачем в коде используется обращение к PROV_RSA_FULL?

dwProvType = 75 (или 80\81)


В моём случае выдает необходимое:
Цитата:

Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Диск Y
Диск D
Offline Den94  
#5 Оставлено : 12 октября 2017 г. 12:17:11(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Автор: Андрей * Перейти к цитате
А зачем в коде используется обращение к PROV_RSA_FULL?

dwProvType = 75 (или 80\81)


В моём случае выдает необходимое:
Цитата:

Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Диск Y
Диск D


Видимо скопипастилось с других функций, сам дурак, признаю. Спасибо.
А можно поподробнее о разницы в dwProvType с 75,80,81.
И теперь если в системе больше одного считывателя, то функция выводит диалог, для выбора этого носителя. Можно просто получить список без него?
Offline Андрей *  
#6 Оставлено : 12 октября 2017 г. 12:24:35(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Автор: Den94 Перейти к цитате
Автор: Андрей * Перейти к цитате
А зачем в коде используется обращение к PROV_RSA_FULL?

dwProvType = 75 (или 80\81)


В моём случае выдает необходимое:
Цитата:

Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Диск Y
Диск D


Видимо скопипастилось с других функций, сам дурак, признаю. Спасибо.
А можно поподробнее о разницы в dwProvType с 75,80,81.
И теперь если в системе больше одного считывателя, то функция выводит диалог, для выбора этого носителя. Можно просто получить список без него?


Указанная функция не выводит диалога, она возвращает список доступных считывателей.
Меняйте код, который не показан в данном посте.

Задача какая вообще?

Offline Den94  
#7 Оставлено : 12 октября 2017 г. 12:35:44(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Автор: Андрей * Перейти к цитате

Указанная функция не выводит диалога, она возвращает список доступных считывателей.
Меняйте код, который не показан в данном посте.

Ну, как бы диалог возникает, когда код входит в эту функцию. Что в коде вне этой функции может влиять на его появление?

Автор: Андрей * Перейти к цитате

Задача какая вообще?

Задача стоит добраться в интерфейсе до сертификатов на носителе, минуя кучу диалоговых окошек. Желательно в виде списка носитель\контейнер\сертификат и дальше работать с выбранным сертификатом
Offline Андрей *  
#8 Оставлено : 12 октября 2017 г. 12:56:37(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
У меня без диалогов.

Что мешает сократить путь и получить непосредственно сами контейнеры через PP_ENUMCONTAINERS ?
Offline Андрей *  
#9 Оставлено : 12 октября 2017 г. 12:58:01(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Вот здесь в исходниках всё есть необходимое (список csp\контейнеров\получение сертификата из контейнера и т.п.)
Offline Den94  
#10 Оставлено : 12 октября 2017 г. 13:01:48(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Автор: Андрей * Перейти к цитате
У меня без диалогов.

Что мешает сократить путь и получить непосредственно сами контейнеры через PP_ENUMCONTAINERS ?


ничего не мешает, просто программа в основном будет работать именно с сертификатами на считывателях. По этому, во-первых, хотелось бы отсечь остальной мусор, а во-вторых, всё таки хорошо бы знать где и что лежит
Offline Андрей *  
#11 Оставлено : 12 октября 2017 г. 13:06:03(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Автор: Den94 Перейти к цитате
Автор: Андрей * Перейти к цитате
У меня без диалогов.

Что мешает сократить путь и получить непосредственно сами контейнеры через PP_ENUMCONTAINERS ?


ничего не мешает, просто программа в основном будет работать именно с сертификатами на считывателях. По этому, во-первых, хотелось бы отсечь остальной мусор, а во-вторых, всё таки хорошо бы знать где и что лежит


Т.е. Вы будете требовать, чтобы клиенты явно сохраняли сертификаты в контейнеры, помимо хранилища сертификатов?
Почему не желаете работать с сертификатами из хранилища Личное?
Offline Den94  
#12 Оставлено : 12 октября 2017 г. 13:24:30(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Автор: Андрей * Перейти к цитате
Автор: Den94 Перейти к цитате
Автор: Андрей * Перейти к цитате
У меня без диалогов.

Что мешает сократить путь и получить непосредственно сами контейнеры через PP_ENUMCONTAINERS ?


ничего не мешает, просто программа в основном будет работать именно с сертификатами на считывателях. По этому, во-первых, хотелось бы отсечь остальной мусор, а во-вторых, всё таки хорошо бы знать где и что лежит


Т.е. Вы будете требовать, чтобы клиенты явно сохраняли сертификаты в контейнеры, помимо хранилища сертификатов?
Почему не желаете работать с сертификатами из хранилища Личное?


Потому что сначала эти сертификаты нужно поместить в "Личное". А объёмы задачи представляются пару десятков ключей на паре десятков машин. И устанавливать все эти сертификаты на все эти машины клиенты вряд ли захотят (смогут) сами. Поэтому и хотелось бы как-то автоматизировать этот процесс. В идеале бы хотелось, работать только с сертификатами на токенах
Offline Den94  
#13 Оставлено : 13 октября 2017 г. 12:49:38(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Внезапно появилась проблема доступа к сертификату на токене.
Как я понимаю, CertOpenSystemStore здесь не подойдёт, в описании CertOpenStore тоже не увидел как вытащить сертификат из контейнера, так же как и в параметрах CryptGetProvParam. Не подскажите где почитать на эту тему?
Offline Андрей *  
#14 Оставлено : 13 октября 2017 г. 13:12:57(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Автор: Den94 Перейти к цитате
Внезапно появилась проблема доступа к сертификату на токене.
Как я понимаю, CertOpenSystemStore здесь не подойдёт, в описании CertOpenStore тоже не увидел как вытащить сертификат из контейнера, так же как и в параметрах CryptGetProvParam. Не подскажите где почитать на эту тему?


А сообщении 9 есть утилита и... Внезапно... Исходник как получить сертификат из контейнера
Offline Den94  
#15 Оставлено : 13 октября 2017 г. 14:11:16(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Видел, запускал, но не находит сертификата на токене, поэтому и спрашиваю
Bezymjannyjj.png (10kb) загружен 3 раз(а).
Offline Андрей *  
#16 Оставлено : 13 октября 2017 г. 17:11:07(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
А он записан в контейнер? Точно?
Offline Андрей *  
#17 Оставлено : 15 октября 2017 г. 22:41:59(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Автор: Den94 Перейти к цитате
Автор: Андрей * Перейти к цитате
А зачем в коде используется обращение к PROV_RSA_FULL?

dwProvType = 75 (или 80\81)


В моём случае выдает необходимое:
Цитата:

Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Диск Y
Диск D


Видимо скопипастилось с других функций, сам дурак, признаю. Спасибо.
А можно поподробнее о разницы в dwProvType с 75,80,81.
И теперь если в системе больше одного считывателя, то функция выводит диалог, для выбора этого носителя. Можно просто получить список без него?


Какая используется версия продукта?

Вместо dwFlags = 0 по документации:
CryptAcquireContext(..., CRYPT_VERIFYCONTEXT);

еще есть CRYPT_SILENT.


в CSP 5 будут отображены новые считыватели:

Цитата:
Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Директория
Диск Y
Диск D
DSS keys



Offline Андрей *  
#18 Оставлено : 15 октября 2017 г. 22:48:36(UTC)
Андрей *


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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 6,879
Мужчина
Российская Федерация

Сказал «Спасибо»: 248 раз
Поблагодарили: 812 раз в 681 постах
Если указывать dwFlags = 0,
в CSP 5 может быть отображен диалог с запросом на выбор носителя, пример:
Snimok ehkrana ot 2017-10-15 23-43-22.png (15kb) загружен 24 раз(а).
Offline Den94  
#19 Оставлено : 16 октября 2017 г. 8:06:27(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

Автор: Андрей * Перейти к цитате
Автор: Den94 Перейти к цитате
Автор: Андрей * Перейти к цитате
А зачем в коде используется обращение к PROV_RSA_FULL?

dwProvType = 75 (или 80\81)


В моём случае выдает необходимое:
Цитата:

Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Диск Y
Диск D


Видимо скопипастилось с других функций, сам дурак, признаю. Спасибо.
А можно поподробнее о разницы в dwProvType с 75,80,81.
И теперь если в системе больше одного считывателя, то функция выводит диалог, для выбора этого носителя. Можно просто получить список без него?


Какая используется версия продукта?

Вместо dwFlags = 0 по документации:
CryptAcquireContext(..., CRYPT_VERIFYCONTEXT);

еще есть CRYPT_SILENT.


в CSP 5 будут отображены новые считыватели:

Цитата:
Реестр
Aktiv Co. ruToken 2
Aktiv Co. ruToken 1
Aktiv Co. ruToken 0
Директория
Диск Y
Диск D
DSS keys





Просто CRYPT_SILENT пробовал - давало ошибку, добавил CRYPT_VERIFYCONTEXT - окно пропало, спасибо

Автор: Андрей * Перейти к цитате
А он записан в контейнер? Точно?

CSP видит и даёт его установить. Версия 4.0.9842. Сертификат, правда, просрочен, но не думаю, что это должно как то мешать?

Bezymjannyjj.png (17kb) загружен 6 раз(а).

Offline Den94  
#20 Оставлено : 18 октября 2017 г. 7:46:35(UTC)
Den94

Статус: Участник

Группы: Участники
Зарегистрирован: 12.10.2017(UTC)
Сообщений: 14

И всё такие есть какие-то предположения почему сертификат не находится на токене?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.