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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline miser  
#1 Оставлено : 27 января 2016 г. 13:45:51(UTC)
miser

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

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

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Подскажите, какой надо использовать алгоритм для создания
Код:

String tmfAlgorithm = "GostX509";
Provider provider; // "JCSP"

TrustManagerFactory.getInstance(tmfAlgorithm, this.getProvider());


Это я пытаюсь клиента JTLS поднять с использованием JCSP.
Клиент JTLS с использованием JCP работает нормально.
Offline Евгений Афанасьев  
#2 Оставлено : 27 января 2016 г. 14:13:35(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Нужно:
cpSSLConfig.setDefaultSSLProvider(JCSP.PROVIDER_NAME);
либо
System.setProperty("ru.CryptoPro.defaultSSLProv", "JCSP");

JCSP реализует только алгоритмы подписи, хеширования, шифрования.
GostX509 - алгоритм из JTLS (cpSSL.jar).

См. Doc/ЖТЯИ.00087-01-JCSP/Руководство программиста (JTLS).pdf.
Offline miser  
#3 Оставлено : 27 января 2016 г. 15:19:11(UTC)
miser

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

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

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Да, да. Я как раз и смотрю документ "ЖТЯИ.00087-01 90 09. Руководство программиста (JTLS).pdf".
Раздел "3.2.Использование КриптоПро JTLS через внешний интерфейс JSSE".
Страница 7, "Другой способ создать защищенный SSL контекст".

Сбивают с толку две строки:
Код:

KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");

Я так понимаю, что первая строка относится к провайдерам JCP и JCSP, отвечающим за контейнеры ключей.
Вторая строка относится к провайдеру "JTLS".

Ну, почему всё так запутано в документации? Прописали бы явно, где и какой провайдер используется.

А еще, заглядываю в документ "ЖТЯИ.00087-01 90 09. Руководство программиста.pdf".
Раздел "2.7.1.1.Инициализация хранилища доверенных сертификатов". Там вижу пример
Код:
KeyStore ks = KeyStore.getInstance("CertStore", "JCSP");

И то же, сижу и чешу репку. То ли "CertStore", то ли "HDIMAGE" для хранилища сертификатов.
В JCP я использую тип хранилища "HDImageStore", для файлов хранилищ, созданных в ControlPanel.

Пытаюсь ради интереса указать "CertStore" для KeyStore, получаю
Код:
java.security.NoSuchAlgorithmException: no such algorithm: CertStore for provider JCSP

Offline Евгений Афанасьев  
#4 Оставлено : 27 января 2016 г. 16:33:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Код:

KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");


Эти строки относятся только к JSSE провайдеру, он реализует менеджер ключей и доверенных сертификатов. Тут указывать провайдер не надо.
Только при передаче KeyStore в их функции один будет HDIMAGE, например, а другой - CertStore. CertStore реализует только JCP.

Пример примерно так будет выглядеть:
Код:

cpSSLConfig.setDefaultSSLProvider(JCSP.PROVIDER_NAME);

KeyStore trustStore = KeyStore.getInstance(JCP.CERT_STORE_NAME);
trustStore.load(new FileInputStream(“path_to_trust_store”), “trust_store_password”.toCharArray()); // хранилище корневых сертификатов

// Если контекст для сервера или для клиента с аутентификацией
if (isServer || clientNeedsAuth) {
  
  KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
  KeyStore keyStore = KeyStore.getInstance(JCSP.HD_STORE_NAME, JCSP.PROVIDER_NAME); // <-- заменили тип хранилища и провайдер для работы с ключами

  keyStore.load(null, null);
  kmf.init(keyStore, “key_store_password”.toCharArray()); // Пароль к контейнеру сервера или клиента

} // if

TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
tmf.init(trustStore);

SSLContext sslCtx = SSLContext.getInstance("GostTLS"); // Защищенный контекст
sslCtx.init(kmf != null ? kmf.getKeyManagers() : null, tmf.getTrustManagers(), null);




Offline miser  
#5 Оставлено : 27 января 2016 г. 17:44:48(UTC)
miser

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

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

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Извините, но к концу рабочего дня у меня уже идет вынос мозга.

Я понимаю, что вы поставили в cpSSLConfig провайдера по умолчанию. Надеюсь, у заказчиков будет работать только один из двух провайдеров. Ожидаю, что будет работать JCSP.

Но вот что меня смущает, это код в 3-й строке. JCP.CERT_STORE_NAME относится к провайдеру JCP, а не к используемому JCSP. И тут меня поджидает неудача.

Код:

InputStream stream = getClass().getClassLoader().getResourceAsStream("jcsp-trust");
Provider provider = Security.getProvider("JCSP");
KeyStore keyStore = KeyStore.getInstance("HDIMAGE", provider);
        
// хранилище без пароля
keyStore.load(stream, null); // ожидаю загрузить файл хранилище сертификатов. 
// keyStore.load(stream, new char[0]); // тот же эффект

for(Enumeration<String> aliases = keyStore.aliases(); aliases.hasMoreElements(); ) {
   String alias = aliases.nextElement();
   System.out.println(alias);
}

Файл хранилища создан в ControlPanel. В хранилище лежит один корневой сертификат.
В личном хранилище контейнеров лежит 17 ключей.
Тест показывает псевдонимы 17 ключей. Я ожидал один корневой сертификат.


Это у меня в JTLS не читает хранилище доверенных сертификатов - trustStore.



Да, я не совсем понимаю, как можно открыть файл. В своей реализации я делал так:
https://github.com/alexe...ity/csp/CSPKeyStore.java

В блоге, http://oldcouncil.blogsp...03/apache-cxf-soap.html, я описывал ситуацию подъема файла хранилища

Пример поднятия можно найти тут:
https://github.com/alexe.../crypto/LocalMerlin.java
начиная со стоки 121.

Отредактировано пользователем 27 января 2016 г. 18:03:42(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#6 Оставлено : 28 января 2016 г. 9:03:38(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
JCSP не реализует алгоритм CertStore, он - алгоритм - есть только в JCP и используется при загрузке сертификатов из доверенного хранилища. HDIMAGE - это тип из csp, он отличается от HDImageStore, который, помимо загрузки контейнеров, может загрузить и сертификаты, как CertStore.

Отредактировано пользователем 28 января 2016 г. 9:04:18(UTC)  | Причина: Не указана

Offline miser  
#7 Оставлено : 28 января 2016 г. 10:38:34(UTC)
miser

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

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

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
А я то, по наивности, надеялся, что JCSP умеет загружать файлы списка сертификатов, как функция CertOpenStore из CSP CAPILite. И даже наводку дал, как реализовал в своем проекте. Я не нашел функций для потокового чтения хранилища.

Так, всё таки, получается, что у клиентов должны стоять JCP и JCSP. Это правильно?
Вопрос упирается в состав нужных лицензий. По идее, нужна лицензия на КрипоПро CSP и лицензия на КриптоПро JCP.
Да и не совсем понятно, зачем использовать JCP, если весь функционал есть в нативном коде CSP.
Offline Евгений Афанасьев  
#8 Оставлено : 28 января 2016 г. 11:31:26(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
В любом случае будет установлен и JCP, и JCSP. JCSP заменяет JCP по части работы с ключами (контейнерами), хеширования, подписи и т.п., а Crypto - в шифровании. Если предполагается использовать JCSP, то лицензия на JCP не нужна.
Offline miser  
#9 Оставлено : 28 января 2016 г. 15:07:37(UTC)
miser

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

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

Сказал «Спасибо»: 1 раз
Поблагодарили: 7 раз в 5 постах
Подскажите, пожалуйста, а как использовать реестры "доверенных" в Windows системе для JTLS?
Ну, те, что в настройках IE можно посмотреть.
Что-то я в ЖТЯИ не нашел этого момента. Может, я не внимательный.
Offline Евгений Афанасьев  
#10 Оставлено : 28 января 2016 г. 16:04:29(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Автор: miser Перейти к цитате
Подскажите, пожалуйста, а как использовать реестры "доверенных" в Windows системе для JTLS?
Ну, те, что в настройках IE можно посмотреть.
Что-то я в ЖТЯИ не нашел этого момента. Может, я не внимательный.


Вы имеете в виду список сертификатов в "доверенных корневых центрах сертификации"? К сожалению, средствами JCP, JTLS или JCSP их не получить. Для JTLS необходим список в виде файла (хранилища).

P.S. Если не ошибаюсь, с помощью MSCAPI провайдера можно работать с этими хранилищами.

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

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