Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline miser  
#1 Оставлено : 29 января 2016 г. 10:55:22(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Наверное, я тут за не штатного тестера устроился. Whistle

Все пытаюсь осилить JCSP. Читаем документ ЖТЯИ.00087-01 90 09. Руководство программиста.pdf
Раздел 2.6.1.1.Определение типа используемого ключевого носителя
Код:
В криптопровайдере КриптоПро JCSP реализовано несколько типов носителей:
* имя "HDIMAGE" определяет жесткий диск;
* имя "REGISTRY" определяет реестр (в случае ОС Windows);
* другие типы носителей.

Очень интересует этот третий тип носителей.
Для этих целей открываем ControlPanel в Windows системе. Видим "Container Stores". Идет "REGISTRY", "AKS VR0", "AKS ifdh 1", "AKS ifdh 0", "FAT 12_B", "FAT 12_A".
Каким способом производить загрузку KeyStore, скажем из последнего носителя, с названием "FAT 12_A"?

Такой способ не проходит:
Код:
Provider provider = Security.getProvider("JCSP");
KeyStore keyStore = KeyStore.getInstance("FAT 12_A", provider);

Провайдер пишет ошибку:
Код:
java.security.KeyStoreException: FAT 12_A not found
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: FAT 12_A for provider JCSP

Вы же в документации обещали другие типы носителей.

Да, попутный вопрос. Если ControlPanel умеет показывать список носителей, можно ли в своей программе получить этот список?
Вопрос связан с тем, что на текущем этапе JCSP не умеет обращаться к хранилищу личных сертификатов ("MY"), где прописано имя контейнера закрытого ключа.
Offline Евгений Афанасьев  
#2 Оставлено : 29 января 2016 г. 12:10:22(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
csptest создает контейнер в \\.\FAT 12_A\container ? Приведите, пожалуйста, лог консоли.
И перечислите типы в csptest: csptest -enum -provtype 75 -type PP_ENUMREADERS -info
Offline miser  
#3 Оставлено : 29 января 2016 г. 13:25:21(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Выполнил
Код:

> csptest -enum -provtype 75 -type PP_ENUMREADERS -info
CSP (Type:75) v4.0.9006 KC1 Release Ver:4.0.9680 OS:Windows CPU:IA32 FastCode:READY:SSSE3,AVX.
CryptAcquireContext succeeded.HCRYPTPROV: 4972920
GetProvParam(...PP_ENUMREADERS...) until it returns false
  Len    Byte  NickName/Name
_____________________________
 0x012a  0x90  REGISTRY
               Реестр
 0x012a  0x72  AKS VR 0
               AKS VR 0
 0x012a  0x72  AKS ifdh 1
               AKS ifdh 1
 0x012a  0x72  AKS ifdh 0
               AKS ifdh 0
 0x012a  0x78  FAT12_B
               Диск B
 0x012a  0x78  FAT12_A
               Диск A
Cycle exit when getting data. 6 items found. Level completed without problems.
Total: SYS: 0,190 sec USR: 0,110 sec UTC: 0,286 sec
[ErrorCode: 0x00000000]

Исправил у себя ошибку. Убрал пробел в названии контейнера. "FAT 12_A" -> "FAT12_A". Тест показал ключи.

В базовой CSP это было как-то проще. Через панель управления регистрирую ключ из контейнера в личных сертификатах. CSP сама перебирает носители и поднимает ключ по названию.
Ну, это как бы, я переставляю дискету из дисковода А в дисковод В или на USB-Flash носитель и вставляю его в разные USB порты.

Есть ли такой универсальный псевдоним KeyStore, который сам найдет закрытый ключ по его названию?
Offline Евгений Афанасьев  
#4 Оставлено : 29 января 2016 г. 14:25:52(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: miser Перейти к цитате
Если ControlPanel умеет показывать список носителей, можно ли в своей программе получить этот список?

Такой вызов должен выдавать список:
Код:

Vector stores = ru.CryptoPro.JCSP.KeyStore.KeyStoreConfig.getNames();


Автор: miser Перейти к цитате
Есть ли такой универсальный псевдоним KeyStore, который сам найдет закрытый ключ по его названию?

Нет.

Отредактировано пользователем 29 января 2016 г. 14:26:23(UTC)  | Причина: Не указана

Offline miser  
#5 Оставлено : 29 января 2016 г. 16:19:21(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Получилось.
Теперь бы еще один секрет раскрыть - названия ключей с русскими буквами.
В теме "ControlPanel под Linux" я показывал, что на экране не отображаются русские буквы.

То же самое происходит у меня в Java тестах под Windows.
В консоли русские буквы видны
Код:
> csptest -keyset -enum_cont -fqcn -verifyc
CSP (Type:80) v4.0.9006 KC1 Release Ver:4.0.9680 OS:Windows CPU:IA32 FastCode:READY:SSSE3,AVX.
AcquireContext: OK. HCRYPTPROV: 4579888
\\.\FAT12_A\УККДжони Тэйлор Кори
...
OK.
Total: SYS: 0,110 sec USR: 0,150 sec UTC: 0,401 sec
[ErrorCode: 0x00000000]

В ControlPanel русские буквы видны.
А в печатаемой строке java
Код:
for(Enumeration<String> aliases = keyStore.aliases(); aliases.hasMoreElements(); ) {
   String readKeyAlias = aliases.nextElement();
   System.out.printf("Проверяем ключ \"%s\" в хранилище \"%s\"\n", readKeyAlias, keyStoreType);
}

выдается текст:
Код:
Проверяем ключ "�������� ������ ����" в хранилище "FAT12_A"

Отредактировано пользователем 29 января 2016 г. 16:24:47(UTC)  | Причина: Не указана

Offline basid  
#6 Оставлено : 29 января 2016 г. 17:24:06(UTC)
basid

Статус: Активный участник

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 153 раз в 138 постах
Код:
java -Dfile.encoding=Кодировка.Консоли ...
Ещё можно IBM JRE использовать - там автоопределение работает Angel
Offline miser  
#7 Оставлено : 1 февраля 2016 г. 10:22:16(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Цитата:
Ещё можно IBM JRE использовать - там автоопределение работает

Честно, это не вариант, а так, полумера, для проведения Unit тестов.
Вы так и будете каждый раз, при обращении к псевдонимам ключей, переключать кодовую страницу консоли?

JCSP отдает строку и она обязана соответствовать стандартам JVM. Это 2 байта на символ, что соответствует UTF-16.
Если бы отдавался массив байт, тогда бы применили нужную кодировку. Но вот, какую, это не известно.
Под Windows - надо читать в Cp866, а под Linux - читать в Cp1251 (Windows-1251).
Ну и как, будем играть в "угадай слово" в вашей операционной системе?
Offline basid  
#8 Оставлено : 1 февраля 2016 г. 17:51:34(UTC)
basid

Статус: Активный участник

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

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 153 раз в 138 постах
Во-первых, если линуксовая консоль использует UTF8, то никаких проблем не должно быть. По крайней мере "Привет, мир?" выдаётся корректно. Вот если ставить всякие противоестественные варианты ...

С виндовой консолью всё несколько сложнее ...
По умолчанию кодировка вывода для Oracle Java совпадает с системным file.encoding и для винды это ANSI-кодировка (Windows-1251 для России).
Но, по историческим причинам, консоль использует OEM-кодировку (Cp866 для России) и IBM J9 это учитывает (есть и автоопределение и отдельное свойство), а Oracle Hotspot - нет (единый file.encoding или "индивидуальный террор").

Поэтому "сол пишется с мягким знаком, вилька и тарелька - бэз. Дэти, это нелзя панят - эта нада запомныт!".
Или ставим кодировку (виндовой) консоли в Cp1251, когда это возможно или задаём нужное значение file.encoding.
В линуксах просто не выёживаемся и используем UTF8.

P.S. В виндах у UTF8-консоли (Cp65001) есть проблемы, поэтому для Oracle Java универсального рецепта нет.

P.P.S. Так и не понял в чём трагедия дописать "chcp 1251" в начало скрипта.
Нет, я в курсе разных проблем и вариантов, но трагедия-то в чём?
Offline Евгений Афанасьев  
#9 Оставлено : 2 февраля 2016 г. 15:41:51(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,003
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
miser, спасибо, проверим информацию.
Offline miser  
#10 Оставлено : 5 февраля 2016 г. 10:48:55(UTC)
miser

Статус: Активный участник

Группы: Участники
Зарегистрирован: 14.03.2011(UTC)
Сообщений: 153
Мужчина
Откуда: Санкт-Петербург

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Цитата:
Во-первых, если линуксовая консоль использует UTF8, то никаких проблем не должно быть


Для начала, предлагаю посмотреть тему "ControlPanel под Linux". В 5-м посте пример работы программы csctest под Linux. Как видите, проблема есть.

Я очень надеюсь, что разработчики исправят ошибки кодировок, как в CSP утилитах (для Linux), так и в библиотеке JCSP.

Цитата:
P.P.S. Так и не понял в чём трагедия дописать "chcp 1251" в начало скрипта.
Нет, я в курсе разных проблем и вариантов, но трагедия-то в чём?


Выскажу свое мнение по поводу "chcp". Начнем с того, что у нас клиентское или серверное решение на Java, а не файл сценария консоли (cmd для Windows или bash для Linux). В большинстве случаев мы имеем дело с много поточными приложениями. Не вдаваться в эти дебри, просто, держим в голове, что одновременно работает несколько потоков. И тут мы в одном из потоков меняем системную переменную. Должен вас огорчить, что значение системной переменной распространяется на действие всех потоков.

Цитата:
Или ставим кодировку (виндовой) консоли в Cp1251

Открою вам очень большой секрет. В языке C/C++ вызываем в main один раз функцию setlocale(LC_ALL, "C"). И чудо свершилось. Код ваш мог быть написан в Windows-1251 или в WCHART (UTF-16), а в консоли вы видите родные русские буквы. И ничего устанавливать не надо.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.