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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline wellusion  
#1 Оставлено : 23 сентября 2021 г. 17:37:36(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
Здравствуйте.
Пробую настроить общение по TLS с lk.eis4.roskazna.ru. Сайт использует ГОСТовское шифрование. При попытке выполнить get-запрос получаю:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Или SSL_ERROR_NO_CYPHER_OVERLAP, если из браузера

Я так понимаю, что настроить общение с ГОСТовским шифрованием можно с помощью JTLS? Но в примерах JCP и здесь на форуме я видел только фрагменты серверной реализации. Могли бы подсказать, где можно посмотреть материалы на эту тему? Или примеры реализации клиента.

В качестве http-клиента использую org.springframework.web.client.RestTemplate . С другими https-соединениям работает.
Offline Евгений Афанасьев  
#2 Оставлено : 25 сентября 2021 г. 14:44:37(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Здравствуйте.
"javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure" - нужно собрать и приложить лог, см. https://support.cryptopr...lirovnija-kriptopro-jtls
"настроить общение с ГОСТовским шифрованием можно с помощью JTLS?" - да
"Могли бы подсказать, где можно посмотреть материалы на эту тему?" - пакет JTLS_samples в архиве samples-sources.jar, в дистрибутиве
Offline wellusion  
#3 Оставлено : 28 сентября 2021 г. 16:20:43(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
Сейчас при использовании JTLS стали падать ошибки tls при соединении с другими адресами.
Например, при выполнении кода:
new URL("https://e-trust.gosuslugi.ru/CA/DownloadTSL?schemaVersion=0").openStream()
сейчас получаю ошибку:


Так же перед этим падал другой экзепшн:

Но после добавления ключа -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 он исчез. Теперь падает указанный выше.

Если удалить JTLS - всё работает. В чём может быть проблема? Нужно где-т изменить какие-то параметры?

И второй вопрос, не не технический. Если у нас приложение (клиент) будет общаться с ресурсами по гост сертификатам, нам так же понадобится устанавливать JCP и JTLS?

Отредактировано пользователем 28 сентября 2021 г. 16:43:15(UTC)  | Причина: Не указана

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

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
1. См. https://www.cryptopro.ru...&m=124818#post124818
2. "Если у нас приложение (клиент) будет общаться с ресурсами по гост сертификатам, нам так же понадобится устанавливать JCP и JTLS?" - да.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
wellusion оставлено 28.09.2021(UTC)
Offline wellusion  
#5 Оставлено : 5 октября 2021 г. 13:03:19(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
Ещё вопрос. В примере:
Цитата:
\jcp-2.0.41752\samples-sources\JTLS_samples\ClientSample.java

Есть фрагмент кода:
Код:
String trustStorePath = "C:/Projects/trust-1.store";
String trustStorePassword = "1";

System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");

SSLContext ctx = TLSContext.initClientSSL(null, trustStorePath, trustStorePassword, null);

При выполнении initClientSSL получаю экзепшн ниже. Пробовал с разными хранилищами: cacerts и jks. В чём может быть проблема?
jcp-2.0.41752; java8

Offline wellusion  
#6 Оставлено : 5 октября 2021 г. 13:23:12(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
Должен быть контейнер с ключом, не только с сертификатом? Но в примере написано про одностороннюю аутентификацию. Я так понял, в хранилище должен быть серт сервера.
Offline Евгений Афанасьев  
#7 Оставлено : 5 октября 2021 г. 14:37:45(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
1. trust-1.store в примере - хранилище корневых сертификатов формата CertStore. В нем должен быть корневой(!) сертификат цепочки сервера. "IOException: Неверный формат хранилища." - у хранилища формат не CertStore или не подходит пароль.
2. Удалите у себя использование Gost2001DateProvider (его использование ведет к "NoSuchFieldException: gost2001Expires"), если перешли на jcp-2.0.41752 - в нем удалены ограничения сроков действия ключей.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
wellusion оставлено 06.10.2021(UTC)
Offline wellusion  
#8 Оставлено : 6 октября 2021 г. 15:01:44(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
Хранилище CertStore создал, экземпляр SSLContext с ним теперь инстанцировался. Но дальше всё равно появились проблемы.
Выполняю пример ClientSample.java, но c url'ом: https://int223.eis4.rosk...n/integrationUpload.html и своим хранилищем сертов, соответственно.
После выполнения фрагмента
Код:
// Установка нового соединения с заданным адресом.
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

падает экзепшн:

Но выполнение продолжается.
Дальше при выполнении:
Код:
connection.getInputStream()

Падает экзепшн:

Пробовал добавлять в харнилище только корневой серт и всю цепочку сертификатов сервера. Адрес, к которому пробую подключиться: https://int223.eis4.rosk...n/integrationUpload.html

Пробовал добавить в начале:
Код:
static {
        HttpsURLConnection.setDefaultHostnameVerifier ((hostname, session) -> true);
}

Ошибка сохраняется. Мб не понял, как его использовать.
В чём может быть проблема?

Ещё момент, при добавлении серта в хранилище, падает ошибка:
keytool error: java.security.KeyStoreException: Unrecognized keystore format: null
Но серт добавляется и в последствии SSLContext с этим хранилищес создаётся.
Offline wellusion  
#9 Оставлено : 6 октября 2021 г. 16:17:45(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
На всякий случай, вот команда, которой добавлял серт в хранилище:
Код:
keytool -J-Dkeytool.compat=true -J-Duse.cert.stub=true -import -alias lk.eis4.roskazna.ru -providerpath d:\programs\jcp\jcp-2.0.41752\JCP.jar;d:\programs\jcp\jcp-2.0.41752\ASN1P.jar;d:\programs\jcp\jcp-2.0.41752\asn1rt.jar;d:\programs\jcp\jcp-2.0.41752\forms_rt.jar;d:\programs\jcp\jcp-2.0.41752\CAdES.jar;d:\programs\jcp\jcp-2.0.41752\cpSSL.jar;d:\programs\jcp\jcp-2.0.41752\JCryptoP.jar;d:\programs\jcp\jcp-2.0.41752\JCPRequest.jar;d:\programs\jcp\jcp-2.0.41752\XMLDSigRI.jar;d:\programs\jcp\jcp-2.0.41752\JCPxml.jar;d:\programs\jcp\jcp-2.0.41752\JCPRevTools.jar;d:\programs\jcp\jcp-2.0.41752\JCPRevCheck.jar;d:\programs\jcp\jcp-2.0.41752\Rutoken.jar;d:\programs\jcp\jcp-2.0.41752\JCPinst.jar -provider ru.CryptoPro.JCP.JCP -storetype CertStore -keystore "D:\projects\tmp\test2-2.keystore" -storepass changeit -file "D:\projects\tmp\lk.eis4.roskazna.ru.cer"
Offline Евгений Афанасьев  
#10 Оставлено : 6 октября 2021 г. 17:28:58(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
1. Возможно, вы что-то не так делаете: убрали лишнее в java.security или наоборот - оставили, например,
Цитата:

ssl.SocketFactory.provider=ru.CryptoPro.ssl.SSLSocketFactoryImpl
ssl.ServerSocketFactory.provider=ru.CryptoPro.ssl.SSLServerSocketFactoryImpl

внизу java.security.
2. Пример ClientSample, скорее всего, не подойдет, потому что указанный адрес как будто(?) требует клиентский сертификат. То есть нужен код, аналогичный AuthClientSample, но измененный под JCP (в этом примере используется Java CSP). Однако с помощью ClientSample попробовать подключиться можно.
3. Рекомендую взять сборку JCP из последних, если это не сделано.
4. В сертификате сервера на указанном адресе задан "CN = eis4.roskazna.ru", что приведет к ошибке вида "No name matching int223.eis4.roskazna.ru found" при подключении на этапе проверки сертификата сервера.
5. Я переименовал параметры ssl.*ManagerFactory* и закомментировал параметры ssl.*SocketFactory* в java.security согласно ранее приложенной по ссылке инструкции, добавил в trust-1.store формата CertoStore корневой сертификат сервера "CN = Тестовый УЦ ООО "КРИПТО-ПРО""; с отключенной проверкой на соответствие хоста и сертификата (п.4) удалось подключиться и получить html-страницу.
Offline wellusion  
#11 Оставлено : 7 октября 2021 г. 12:29:53(UTC)
wellusion

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

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

Сказал(а) «Спасибо»: 5 раз
Цитата:
с отключенной проверкой на соответствие хоста и сертификата

А как вы её отключили?
Я находил только такой вариант:
Код:
HttpsURLConnection.setDefaultHostnameVerifier ((hostname, session) -> true);

Но ошибка CertificateException: No name matching int223.eis4.roskazna.ru found остаётся.

С остальными ошибками разобрался. Во-первых, в java.security действительно я раскомменировал строчки выше. Сейчас обратно убрал. Во-вторых, в keytool, которым я собирал хранилище, было из java11. Там, похоже, какая-то бага. С keytool'ом из java8 хранилище собралось без ошибок.
Offline Евгений Афанасьев  
#12 Оставлено : 7 октября 2021 г. 12:55:10(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 596 раз в 566 постах
Автор: wellusion Перейти к цитате
А как вы её отключили?

С помощью
Код:

System.setProperty("tls_prohibit_disabled_validation", "false"); // тогда сработает HttpsURLConnection.setDefaultHostnameVerifier

Это наша настройка, по умолчанию ряд проверок включен, это нормально (чтобы не явно не отключали проверки с помощью setDefaultHostnameVerifier); и сертификат сервера должен соответствовать требованиям, его надо перевыпустить. Поэтому указанную настройку нужно использовать только в тестах, так как по требованиям она должна быть включена.

Отредактировано пользователем 7 октября 2021 г. 12:59:36(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
wellusion оставлено 07.10.2021(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.