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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline AlexanderD  
#1 Оставлено : 27 августа 2018 г. 19:13:58(UTC)
AlexanderD

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

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

Добрый день!

Подскажите что не так.
Есть код

Код:


        URL url = new URL(dssURL);

        KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
        keyStore.load(null, KEY_PASSWORD.toCharArray());
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        kmf.init(keyStore, KEY_PASSWORD.toCharArray());

        
        //      Первый блок
        KeyStore trustedKeyStore = KeyStore.getInstance("JKS");
        trustedKeyStore.load(new FileInputStream(TRUST_CERT_FILE), TRUST_PASSWORD.toCharArray());
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("GostX509");
        tmf.init(trustedKeyStore);
        
        //      Второй блок  
//        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
//        System.setProperty("javax.net.ssl.trustStore", TRUST_CERT_FILE);
//        System.setProperty("javax.net.ssl.trustStorePassword", TRUST_PASSWORD);

        SSLContext sslContext = SSLContext.getInstance("GostTLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
        SSLSocketFactory socketFactory = sslContext.getSocketFactory();

        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setDefaultSSLSocketFactory(socketFactory);

        con.connect();


В результате его выполнения получаю:

Код:

Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
	at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)



Но, если раскоментировать второй блок, т.е. установка трастового хранилища пропертями, то все работает!
Как сделать так чтобы работало через первый блок, т.е. через созданный трастменеджер?

Спасибо!

Отредактировано пользователем 27 августа 2018 г. 19:14:41(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 28 августа 2018 г. 13:09:52(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 15 раз
Поблагодарили: 529 раз в 507 постах
Здравствуйте.
Код должен выглядеть примерно так:
Код:

        System.setProperty("com.sun.security.enableCRLDP", "true");
        URL url = new URL("https://testgost2012st.cryptopro.ru/gost2st.txt");

        KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP");
        keyStore.load(null, null);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("GostX509");
        kmf.init(keyStore, "1".toCharArray()); // пароль для подбора контейнера

        KeyStore trustedKeyStore = KeyStore.getInstance("JKS");
        trustedKeyStore.load(new FileInputStream("store.jks"), "123456".toCharArray());

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

        SSLContext sslContext = SSLContext.getInstance("GostTLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        SSLSocketFactory socketFactory = sslContext.getSocketFactory();

        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setSSLSocketFactory(socketFactory); // не HttpsURLConnection.setDefaultSSLSocketFactory!

        connection.connect();
        print_content(connection);

        connection.disconnect();
        System.out.println("OK");

Когда используется setDefaultSSLSocketFactory, то все работает несколько иначе: у SSLSocketFactory вызывается DefaultSSLContext без учета ранее настроенного SSLContext, который пытается получить trust store из настроек System.Properties, их нет - тогда по умолчанию в качестве trust store используется HDImageStore (если есть System.Properties - trust store грузится из настроек).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Санчир Момолдаев оставлено 07.08.2020(UTC)
Offline AlexanderD  
#3 Оставлено : 28 августа 2018 г. 14:43:32(UTC)
AlexanderD

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

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

Все заработало, спасибо огромное, кучу времени сэкономили!
Offline Oleg Frolov  
#4 Оставлено : 15 сентября 2020 г. 19:32:49(UTC)
Oleg Frolov

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

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

Сказал(а) «Спасибо»: 6 раз
Добрый день!

Подскажите, пожалуйста.

Есть такой код:

Код:
URL url = new URL("https://dss.cryptopro.ru/verify/rest/api/certificates");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.connect();


Если установлен JCP без TLS провайдера, либо JCP не установлен вообще, то соединение успешно (далее в коде отправляю запрос, получаю ответ).

Но, если установлен JCP вместе с TLS провайдером, то получаю ошибку "TrustAnchors parameter must be non-empty".
Как я понимаю, если установлен TLS провайдер, то в коде необходимо добавить trustedKeyStore и keyStore.
Но в данном случае я не хочу добавлять никаких хранилищ.

Нужно, чтобы код работал также как и до установки TLS провайдера. Что необходимо для этого сделать?
Почему после установки TLS провайдера появляется эта ошибка?

JCP v2.0
Windows 7

Отредактировано пользователем 15 сентября 2020 г. 19:33:54(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#5 Оставлено : 15 сентября 2020 г. 19:51:38(UTC)
Санчир Момолдаев

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

Группы: Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 436
Российская Федерация

Сказал(а) «Спасибо»: 52 раз
Поблагодарили: 64 раз в 63 постах
Автор: Oleg Frolov Перейти к цитате
Добрый день!

Подскажите, пожалуйста.

Есть такой код:

Код:
URL url = new URL("https://dss.cryptopro.ru/verify/rest/api/certificates");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.connect();


Если установлен JCP без TLS провайдера, либо JCP не установлен вообще, то соединение успешно (далее в коде отправляю запрос, получаю ответ).

Но, если установлен JCP вместе с TLS провайдером, то получаю ошибку "TrustAnchors parameter must be non-empty".
Как я понимаю, если установлен TLS провайдер, то в коде необходимо добавить trustedKeyStore и keyStore.
Но в данном случае я не хочу добавлять никаких хранилищ.

Нужно, чтобы код работал также как и до установки TLS провайдера. Что необходимо для этого сделать?
Почему после установки TLS провайдера появляется эта ошибка?

JCP v2.0
Windows 7


Добрый день!
установите JCP + cpSSL (JTLS)
далее необходимо отменить изменения которые внес cpSSL
в java.security найдите следующие параметры и измените их значение:
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
ssl.SocketFactory.provider=
ssl.ServerSocketFactory.provider=

если нужно использовать гост тлс в коде то можно установить их программно:
Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl")
Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl")
Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509")
Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509")

либо делать connection.setSSLSocketFactory(ctx.getSocketFactory()); для гостовых тлс соединений

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
Oleg Frolov оставлено 16.09.2020(UTC)
Offline Oleg Frolov  
#6 Оставлено : 16 сентября 2020 г. 11:58:40(UTC)
Oleg Frolov

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

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

Сказал(а) «Спасибо»: 6 раз
Автор: Санчир Момолдаев Перейти к цитате
Автор: Oleg Frolov Перейти к цитате
Добрый день!

Подскажите, пожалуйста.

Есть такой код:

Код:
URL url = new URL("https://dss.cryptopro.ru/verify/rest/api/certificates");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
connection.connect();


Если установлен JCP без TLS провайдера, либо JCP не установлен вообще, то соединение успешно (далее в коде отправляю запрос, получаю ответ).

Но, если установлен JCP вместе с TLS провайдером, то получаю ошибку "TrustAnchors parameter must be non-empty".
Как я понимаю, если установлен TLS провайдер, то в коде необходимо добавить trustedKeyStore и keyStore.
Но в данном случае я не хочу добавлять никаких хранилищ.

Нужно, чтобы код работал также как и до установки TLS провайдера. Что необходимо для этого сделать?
Почему после установки TLS провайдера появляется эта ошибка?

JCP v2.0
Windows 7


Добрый день!
установите JCP + cpSSL (JTLS)
далее необходимо отменить изменения которые внес cpSSL
в java.security найдите следующие параметры и измените их значение:
ssl.KeyManagerFactory.algorithm=SunX509
ssl.TrustManagerFactory.algorithm=PKIX
ssl.SocketFactory.provider=
ssl.ServerSocketFactory.provider=

если нужно использовать гост тлс в коде то можно установить их программно:
Security.setProperty("ssl.SocketFactory.provider", "ru.CryptoPro.ssl.SSLSocketFactoryImpl")
Security.setProperty("ssl.ServerSocketFactory.provider", "ru.CryptoPro.ssl.SSLServerSocketFactoryImpl")
Security.setProperty("ssl.KeyManagerFactory.algorithm", "GostX509")
Security.setProperty("ssl.TrustManagerFactory.algorithm", "GostX509")

либо делать connection.setSSLSocketFactory(ctx.getSocketFactory()); для гостовых тлс соединений



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