Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,955 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 701 раз в 662 постах
|
Здравствуйте. Код должен выглядеть примерно так: Код:
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 грузится из настроек). |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 27.08.2018(UTC) Сообщений: 2
|
Все заработало, спасибо огромное, кучу времени сэкономили!
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Модератор, Участники Зарегистрирован: 03.12.2018(UTC) Сообщений: 1,123 Сказал(а) «Спасибо»: 92 раз Поблагодарили: 246 раз в 231 постах
|
Автор: 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()); для гостовых тлс соединений |
|
1 пользователь поблагодарил Санчир Момолдаев за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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()); для гостовых тлс соединений Теперь ясно где были изменения. Все работает. Спасибо!
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close