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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline OlgaMakarova  
#1 Оставлено : 18 января 2019 г. 14:29:10(UTC)
OlgaMakarova

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

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

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

Наше приложение A (на java8 в контейнере TomCat7) работает как сервер-поставщик данных для клиента B. Клиент B обращается к нашему приложению по защищенному каналу с двусторонней аутентификацией.
Обращений от клиента мы ждем на один из портов TomCatа. Коннектор настроен так, как написано в инструкции
https://support.cryptopr...pro-jtls-v-apache-tomcat

Кроме того, наше приложение А само является клиентом серверных приложений C и D. Тут тоже используется канал с двусторонней аутентификацией.

Чтобы приложение продолжало нормально работать со старыми сертификатами, мы пропатчили КриптоПро JCP 2.0.39014 так, как написано тут
https://support.cryptopr...-v-kriptopro-jcp-2039014

И все работало хорошо, пока клиент B не решил проверить работу с сертификатом на ГОСТе 2012. Соединение не устанавливалось.
Я решила поменять параметры коннектора в TomCat.

<Connector port="***" maxHttpHeaderSize="24192" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true" clientAuth="true" algorithm="GostX509" keystoreProvider="JCP" sslProtocol="GostTLS"
keystoreType="HDImageStore" keyalg="GOST3410_2012_256" sigalg="GOST3411withGOST3410EL"
keystoreFile="***" keystorePass="***"
truststoreFile="***" truststorePass="***"
maxKeepAliveRequests="1"
ciphers="TLS_CIPHER_2012" sslEnabledProtocols="GostTLS" keepAliveTimeout="60000"/>

Возможно, неправильно? Я не нашла инструкции.

После этого клиент B успешно отработал по новому сертификату на ГОСТ 2012,
но перестали нормально работать соединения с серверами C и D. Почему-то настройки коннектора влияют на работу остальной библиотеки, которую мы используем из java-кода.

янв 17, 2019 7:43:36 PM ru.CryptoPro.ssl.w <init>
FINER: Validator() count of trusted certificates: 0
янв 17, 2019 7:43:36 PM ru.CryptoPro.ssl.am a
FINER: http-apr-7100-exec-1, handling exception: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
янв 17, 2019 7:43:36 PM ru.CryptoPro.ssl.am a
FINE: THROW
java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at ru.CryptoPro.ssl.w.<init>(Unknown Source)
at ru.CryptoPro.ssl.g.b(Unknown Source)
at ru.CryptoPro.ssl.g.checkServerTrusted(Unknown Source)


Видимо, он теперь хочет видеть только trusted сертификаты на ГОСТ 2012? Я не знаю.

Помогите, пожалуйста, настроить TomCat, чтобы можно было работать с сертификатами и по ГОСТ 2001, и по ГОСТ 2012.
Offline Евгений Афанасьев  
#2 Оставлено : 18 января 2019 г. 14:59:36(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Уточню.
A <-> B = используют ГОСТ 2001. На A - есть коннектор, используется серверный контейнер ГОСТ 2001, на клиенте B - ГОСТ 2001.
A <-> (C, D) = используют ГОСТ 2001. На А - клиентский контейнер ГОСТ 2001, на серверах C, D - серверные ГОСТ 2001.

Затем A <-> B стали использовать ГОСТ 2012. То есть B получил клиентский ГОСТ 2012.
Для этого на А потребуется, как минимум, добавить ciphersuite = TLS_CIPHER_2012. Это вы выполнили, связь A <-> B заработала.
Настройки коннектора как-то влияют на их работу (используются каким-то образом в приложении)?
Файл с доверенными корневыми сертификатами (trust store) менялся?
Как создается защищенный контекст SSLContext для работы с C, D - программно, с помощью интерфейсов/классов *ManagerFactory, *Manager или как-то иначе?
Попробуйте добавить не ciphers="TLS_CIPHER_2012", а ciphers="TLS_CIPHER_2012,TLS_CIPHER_2001"

P.S. Вообще, ошибка
Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
обычно возникает, если в списке нет доверенных корневых сертификатов, то есть список trus store пуст. Поэтому основной вопрос - не менялся ли trust store, поскольку появился новый клиентский сертификат у B, он мог быть выпущен в другом УЦ, сертификат которого, вероятно, был добавлен в trust store.

Отредактировано пользователем 18 января 2019 г. 15:13:56(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
OlgaMakarova оставлено 18.01.2019(UTC)
Offline OlgaMakarova  
#3 Оставлено : 18 января 2019 г. 15:31:39(UTC)
OlgaMakarova

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

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

Сказал(а) «Спасибо»: 5 раз
Спасибо за ответ. Да, все правильно описано.

Настройки коннектора в приложении не используются.
В доверенные сертификаты с помощью jcp-консоли я добавила всю цепочку новых сертификатов (на ГОСТ 2012) клиента B.

Защищенный контекст SSLContext для работы с C, D создается с помощью стандартного явовского HttpsURLConnection и установки парметров javax.net.ssl.* в System.setProperty.

Большое спасибо за советы.

1) Я попробую установить ciphers="TLS_CIPHER_2012,TLS_CIPHER_2001"
2) Если не поможет, я создам защищенный контекст с помощью keyManagerFactory и trustManagerFactory.

Результаты напишу сюда.

P.S.
Да, trust store менялся. Была добавлена вся цепочка сертификатов на ГОСТ 2012. Но старые сертификаты не были удалены из trust store.

Отредактировано пользователем 18 января 2019 г. 15:37:07(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 18 января 2019 г. 16:06:57(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Еще я бы попросил вас собрать лог для последнего случая с ошибкой trust store, с SSLLogger уровня ALL. Как включить логирование, описано тут https://support.cryptopr...irovnija-kriptopro-jtls, но у tomcat, вероятно, свой logging.properties, у него будет что-то вроде (добавления выделил стрелками):
Код:

handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler,5catalina.org.apache.juli.FileHandler <--

.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

5catalina.org.apache.juli.FileHandler.level=ALL <--
5catalina.org.apache.juli.FileHandler.directory=${catalina.base}/logs <--
5catalina.org.apache.juli.FileHandler.prefix=cryptopro. <--

############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler

# For example, set the com.xyz.foo logger to only log SEVERE
# messages:
#org.apache.catalina.startup.ContextConfig.level = FINE
#org.apache.catalina.startup.HostConfig.level = FINE
#org.apache.catalina.session.ManagerBase.level = FINE
#org.apache.catalina.core.AprLifecycleListener.level=FINE

ru.CryptoPro.JCP.tools.JCPLogger.level=INFO
ru.CryptoPro.JCP.tools.JCPLogger.handlers=5catalina.org.apache.juli.FileHandler

ru.CryptoPro.ssl.SSLLogger.level=ALL <--
ru.CryptoPro.ssl.SSLLogger.handlers=5catalina.org.apache.juli.FileHandler <--

Offline Евгений Афанасьев  
#5 Оставлено : 18 января 2019 г. 16:10:25(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Попробуйте переделать на передачу фабрики factory = SSLContext.getSocketFactory() объекта SSLContext (с менеджерами ключей и сертификатов) в метод setSSLSocketFactory объекта HttpsUrlConnection connection (не статическую функцию класса HttpsUrlConnection).

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

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
OlgaMakarova оставлено 21.01.2019(UTC)
Offline OlgaMakarova  
#6 Оставлено : 21 января 2019 г. 8:21:36(UTC)
OlgaMakarova

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

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

Сказал(а) «Спасибо»: 5 раз
Большое спасибо.

После вашего ответа, я вспомнила, что я ранее уже реализовала для еще одного интерфейса работу через
val context: SSLContext = SSLContext.getInstance("GostTLS");
и setSSLSocketFactory объекта HttpsUrlConnection
(с менеджерами ключей и сертификатов)

Я проверила, и этот интерфейс отлично работает с сертификатами на старом ГОСТе одновременно с работой интерфейса A-B на новом сертификате.


Интересно, что после нескольких ресетов TomCat-а заработал и этот старый код, который выставляет все свойства SSL через System.setProperty. Не знаю, насколько это стабильно, и будет ли оно работать после еще пары ресетов. Но мне уже понятны пути решения проблемы, если она возникнет.

Большое спасибо за помощь!

P.S.
Если вам еще нужен лог с Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
я могу его выслать. Я сохранила тот файл.

Отредактировано пользователем 21 января 2019 г. 8:28:42(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#7 Оставлено : 21 января 2019 г. 9:41:53(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Да, если не сложно, вышлите лог. Возможно, возникли какие-то конфликты для System.setProperty, т.к. эти настройки задаются глобально, например, для контекста по умолчанию. Если снова возникнет ошибка, напишите, будем воспроизводить у себя.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.