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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline RangerX  
#1 Оставлено : 3 апреля 2012 г. 19:15:24(UTC)
RangerX

Статус: Новичок

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

Здравствуйте. Ситуация: Jetty + Servlet + попытка подключиться к сайту.
Кусок кода:

Код:
   log.debug("Initializing SSL...");

            Security.addProvider(new ru.CryptoPro.JCP.JCP()); // без этой строчки ругается на отсутствие провайдера JCP

            System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");
            System.setProperty("javax.net.ssl.trustStoreType", "HDImageStore");
            System.setProperty("javax.net.ssl.trustStore", "D:\\EI\\truststore.store");
            System.setProperty("javax.net.ssl.trustStorePassword", "111");
            //Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509");
            //Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509");

            KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
            keyStore.load(new FileInputStream("D:\\EI\\truststore.store", "111".toCharArray());

            // Менеджер хранилища
            TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
            tmf.init(keyStore);
            TrustManager tms[] = tmf.getTrustManagers();

            // SSL Контекст
            SSLContext sc = SSLContext.getInstance("GostTLS");

            sc.init(null, tms, SecureRandom.getInstance("CPRandom", "JCP"));
            sslFactory = sc.getSocketFactory();

На строчке TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509"); возникает ошибка:
Код:
java.security.NoSuchAlgorithmException: GostX509 TrustManagerFactory not available
	at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)
	at javax.net.ssl.TrustManagerFactory.getInstance(TrustManagerFactory.java:138)
	at db.Cache.<clinit>(Cache.java:64)
	at web.WebServlet.init(WebServlet.java:40)
	at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:492)
	at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:312)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59)
	at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:777)
	at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:258)
...

ru.CryptoPro.JCP.VMInspector.SelfTestersTests выдает, что все ОК.
Offline Евгений Афанасьев  
#2 Оставлено : 3 апреля 2012 г. 19:36:17(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
Здравствуйте.
JCP устанавливали по инструкции?
Offline RangerX  
#3 Оставлено : 3 апреля 2012 г. 22:23:31(UTC)
RangerX

Статус: Новичок

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

Да, JCP и JTLS установлены по инструкции. Проблема, судя по всему, не в них, а именно в связке c Jetty. Т.к. я попробовал откомпилировать программу не как сервлет, а просто как программу - и все замечательно отработало, даже без строки
Код:
Security.addProvider(new ru.CryptoPro.JCP.JCP());

Тогда я в код сервлета добавил еще одну строчку:
Код:
Security.addProvider(new Provider());

После этого ошибка из топика пропала, зато появилась другая: java.security.ProviderException: Crypto not available
Вот теперь думаю, что ему еще не хватает.
Вообще сложилось впечатление, что Jetty "не дружит" с java.security, либо "дружит", но по каким-то своим правилам.
Offline Евгений Афанасьев  
#4 Оставлено : 3 апреля 2012 г. 23:10:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 729 раз в 687 постах
А у вас JRE одна установлена?
Возможно, все-таки какая-то ошибка в связке jetty и jre.
jtls (cpSSL.jar) для работы с ГОСТ TLS вы установили?

Попробовал воспроизвести вашу ситуацию: Windows 7 (32-б.), Eclipse Indigo + jetty 7.1, тестовый сервлет, который выполняет похожий (взят из поста) код:

// Доверенный сертификат.
KeyStore trustStore = KeyStore.getInstance("HDImageStore", "JCP");
trustStore.load(new FileInputStream("...\\app\\store\\CATrustStore"),
"Pass1234".toCharArray());

// Менеджер хранилища
TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
tmf.init(trustStore);
TrustManager tms[] = tmf.getTrustManagers();

// Ключи JCP - у меня есть там подходящий ключ для двухсторонней аутентификации.
KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
keyStore.load(null, null);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
kmf.init(keyStore, "security".toCharArray());
KeyManager km[] = kmf.getKeyManagers();

// SSL Контекст
SSLContext sc = SSLContext.getInstance("GostTLS");

sc.init(km, tms, SecureRandom.getInstance("CPRandom", "JCP"));
SSLSocketFactory sslFactory = sc.getSocketFactory();

// Подключаемся к https://cpca.cryptopro.ru/tls/tls-cli.asp, где нужна двухсторонняя аутентификация по ГОСТ TLS 1.0
Socket socket = sslFactory.createSocket("cpca.cryptopro.ru", 443);

final InputStream in = socket.getInputStream();
final OutputStream out = socket.getOutputStream();

// Запрос.
final String req = "GET /tls/tls-cli.asp HTTP/1.0\r\n\r\n";

....
// Вывод на экран
....

Получил ожидаемую страницу с параметрами сертификата клиента.

Пробовал и другой вариант - более короткий:

// Задаем клиентский сертификат и ключ.
System.setProperty("javax.net.ssl.keyStoreType", "HDImageStore");
System.setProperty("javax.net.ssl.keyStore", "my_alias");
System.setProperty("javax.net.ssl.keyStorePassword", "security");

URL url = new URL("https://cpca.cryptopro.ru/tls/tls-cli.asp");

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.connect();

// Читаем страницу.
String result = print_content(connection);
connection.disconnect();

Выводится та же страница.

Отредактировано пользователем 4 апреля 2012 г. 4:05:43(UTC)  | Причина: Не указана

Offline RangerX  
#5 Оставлено : 4 апреля 2012 г. 11:05:41(UTC)
RangerX

Статус: Новичок

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

Да, Вы оказались правы, проблема была связана с JDK/JRE. У меня установлены и JDK и JRE, но JCP я устанавливал только в JRE, полагая, что runtime-библиотеки в JDK мне не нужны, да и насколько я знаю runtime-машина в JDK это урезанная версия основного JRE.
А оказалось, что используемая мною JetBrains IDEA запускала Jetty используя как раз JDK :) В итоге проблема была решена установкой JCP+JTLS еще и в JDK. Спасибо за участие! :)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.