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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline squadgazzz  
#1 Оставлено : 18 ноября 2020 г. 15:28:40(UTC)
squadgazzz

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

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

Сказал(а) «Спасибо»: 5 раз
В системе установлен CSP 5.0.11823.
Использую Java CSP 5.0.40621-A и Java 11.
Для сетевого взаимодействия используется библиотека netty.
Передаю вот такой контекст:
Код:
SslContextBuilder
  .forServer(keyManagerFactory)
  .trustManager(trustManagerFactory)
  .protocols("GostTLS")
  .ciphers(List("TLS_CIPHER_2012", "TLS_CIPHER_2001"))
  .build()


При запуске приложения получаю
Код:
java.lang.IllegalArgumentException: Unsupported CipherSuite: TLS_CIPHER_2012
	at java.base/sun.security.ssl.CipherSuite.validValuesOf(Unknown Source)
	at java.base/sun.security.ssl.SSLEngineImpl.setEnabledCipherSuites(Unknown Source)
	at io.netty.handler.ssl.JdkSslContext.configureAndWrapEngine(JdkSslContext.java:340)
	at io.netty.handler.ssl.JdkSslContext.newEngine(JdkSslContext.java:335)
	at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:997)
	at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:989)


Предварительно выполнена следующая инициализация
Код:
Security.addProvider(new JCSP())
Security.addProvider(new RevCheck())
Security.addProvider(new CryptoProvider())
Security.addProvider(new Provider())

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

Offline Евгений Афанасьев  
#2 Оставлено : 19 ноября 2020 г. 10:10:56(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Здравствуйте.
Автор: squadgazzz Перейти к цитате
java.lang.IllegalArgumentException: Unsupported CipherSuite: TLS_CIPHER_2012
at java.base/sun.security.ssl.CipherSuite.validValuesOf(Unknown Source)
at java.base/sun.security.ssl.SSLEngineImpl.setEnabledCipherSuites(Unknown Source)

Вызывается внутренняя sun-реализация TLS, которая не знает о ГОСТе.
Предположу, что у SslContextBuilder должен быть метод для передачи ему SSLContext или SSLSocketFactory, которые можно создать с указанием нужных ГОСТ алгоритмов (см. руководство разработчика JTLS и создание SSLContext в примерах в JTLS_samples в архиве samples-sources.jar).
Offline squadgazzz  
#3 Оставлено : 19 ноября 2020 г. 11:21:12(UTC)
squadgazzz

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

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате

Вызывается внутренняя sun-реализация TLS, которая не знает о ГОСТе.
Предположу, что у SslContextBuilder должен быть метод для передачи ему SSLContext или SSLSocketFactory, которые можно создать с указанием нужных ГОСТ алгоритмов (см. руководство разработчика JTLS и создание SSLContext в примерах в JTLS_samples в архиве samples-sources.jar).


Передать готовый контекст некуда, зато можно передать Provider
Код:
SslContextBuilder
  .forServer(keyManagerFactory)
  .trustManager(trustManagerFactory)
  .sslContextProvider(gostSslProvider) // используется тот же инстанс провайдера, что при инициализации Криптопро Security.addProvider(new Provider())
  .protocols("GostTLS")
  .ciphers(List("TLS_CIPHER_2012", "TLS_CIPHER_2001"))
  .build()


Но теперь ошибка следующая

Код:
|java.lang.IllegalArgumentException: GostTLS                                                                                                                                     
|       at ru.CryptoPro.ssl.cl_74.a(Unknown Source)                                                                                                                              
│       at ru.CryptoPro.ssl.cl_73.a(Unknown Source)                                                                                                                              
│       at ru.CryptoPro.ssl.cl_73.<init>(Unknown Source)                                                                                                                         
│       at ru.CryptoPro.ssl.SSLEngineImpl.setEnabledProtocols(Unknown Source)                                                                                                    
│       at io.netty.handler.ssl.JdkSslContext.configureAndWrapEngine(JdkSslContext.java:341)                                                                                     
│       at io.netty.handler.ssl.JdkSslContext.newEngine(JdkSslContext.java:335)                                                                                                  
│       at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:997)                                                                                                       
│       at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:989)


Пробовал передавать TLSv1.0, тоже не срабатывает
Offline Евгений Афанасьев  
#4 Оставлено : 19 ноября 2020 г. 11:50:44(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
Попробуйте .protocols("TLSv1")
Offline squadgazzz  
#5 Оставлено : 19 ноября 2020 г. 12:15:36(UTC)
squadgazzz

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

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
Попробуйте .protocols("TLSv1")


Сработало, ещё такое же поведение, если вообще не указывать никакой протокол.
Сначала ворнинги, потом ошибки уже при хендшейке с другим инстансом приложения.
Offline Евгений Афанасьев  
#6 Оставлено : 19 ноября 2020 г. 12:23:38(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
%% No alias is match
А контейнер сделали для клиента/сервера? Смотря что у вас. Для сервера - обязательно (сертификат с использованием ключа "Аутентификация сервера"), для клиента - если на сервере включена клиентская аутентификация (сертификат с использованием ключа "Аутентификация клиента"). Контейнер с паролем. В SSLContext надо подавать тип хранилища с паролем для контенйнера, чтобы он был выбран. И права у приложения должны быть для доступа к контейнеру.
Offline squadgazzz  
#7 Оставлено : 19 ноября 2020 г. 12:43:34(UTC)
squadgazzz

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

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
%% No alias is match
А контейнер сделали для клиента/сервера? Смотря что у вас. Для сервера - обязательно (сертификат с использованием ключа "Аутентификация сервера"), для клиента - если на сервере включена клиентская аутентификация (сертификат с использованием ключа "Аутентификация клиента"). Контейнер с паролем. В SSLContext надо подавать тип хранилища с паролем для контенйнера, чтобы он был выбран. И права у приложения должны быть для доступа к контейнеру.


Со стороны клиента и сервера передается KeyManagerFactory и TrustManagerFactory через SslContextBuilder(код билдера приведен выше).
Фабрики создаются следующим образом:
Код:
val keyStore = {
  val ks = KeyStore.getInstance("HDImageStore")
  HDImageStore.setDir("/var/opt/cprocsp/keys/my_username")
  ks.load(null, null)
  ks
}

val keyManagerFactory: KeyManagerFactory = {
  val kmf = KeyManagerFactory.getInstance("GostX509")
  kmf.init(keyStore, "123456")
  kmf
}

val trustManagerFactory: TrustManagerFactory = {
  val tmf = TrustManagerFactory.getInstance("GostX509")
  tmf.init(keyStore)
  tmf
}


2 запущенных приложения общаются исключительно между собой. Оба смотрят на одно и то же хранилище сертификатов

Ключи создавал вот так, они автоматом попали в HDImageStore
Код:
keytool -genkeypair -alias myKeyPair23 -J-Dkeytool.compat=true -J-Duse.cert.stub=true -providerpath ./java-csp-5.0.40621-A/JCSP.jar;./java-csp-5.0.40621-A/JCP.jar;./java-csp-5.0.40621-A/ASN1P.jar;./java-csp-5.0.40621-A/asn1rt.jar;./java-csp-5.0.40621-A/forms_rt.jar -keysize 512 -provider ru.CryptoPro.JCSP.JCSP -storetype HDIMAGE -keyalg GOST3410EL -sigalg GOST3411withGOST3410EL -keystore NONE -storepass 123456 -keypass 123456 -dname "CN=TestCN,OU=Security,O=CryptoPro,C=RU"

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

Offline Евгений Афанасьев  
#8 Оставлено : 19 ноября 2020 г. 12:56:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 685 раз в 646 постах
1. У trustManagerFactory должен быть свой keystore с корневым сертификатом другой стороны, то есть некое хранилище доверенных корневых.
2. По логам был поиск подходящего сертификата, но ничего не найдено. Либо пароль 123456 не подходит к контейнеру, либо у пользователя, под которым запущено приложение, нет ключевых контейнеров, либо сертификат в контейнере с паролем 123456 отсутствует или просрочнен.
Offline squadgazzz  
#9 Оставлено : 19 ноября 2020 г. 13:22:47(UTC)
squadgazzz

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

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

Сказал(а) «Спасибо»: 5 раз
Автор: Евгений Афанасьев Перейти к цитате
1. У trustManagerFactory должен быть свой keystore с корневым сертификатом другой стороны, то есть некое хранилище доверенных корневых.

Это хранилище должно быть создано тоже с провайдером JCSP и ГОСТ алгоритмом? Если да, то как создать ещё одно хранилище в системе?
И не совсем понял зачем это.
Когда мы использовали обычный TLSv1.2, то в JKS хранилище лежали и ключи и сертификаты.
Код:
keytool -genkeypair -keyalg RSA -alias we -keypass 123456 -keystore my.jks -storepass 123456 -dname "CN=TestCN,O=TEST,C=US" -validity 9999

Оба приложения смотрели на одно и то же хранилище, соответственно, они искали сертификаты самих себя.
Для теста тоже используется одна машина и одно хранилище.

Автор: Евгений Афанасьев Перейти к цитате

2. По логам был поиск подходящего сертификата, но ничего не найдено. Либо пароль 123456 не подходит к контейнеру, либо у пользователя, под которым запущено приложение, нет ключевых контейнеров, либо сертификат в контейнере с паролем 123456 отсутствует или просрочнен.


С паролем 123456 создаю ключи и просматриваю содержимое HDImageStore без ошибок.

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

Offline squadgazzz  
#10 Оставлено : 19 ноября 2020 г. 17:11:44(UTC)
squadgazzz

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

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

Сказал(а) «Спасибо»: 5 раз
Сертификат выгружаю так
Код:
keytool -export  -file ./keyonenineA.cert -J-Dkeytool.compat=true -J-Duse.cert.stub=true -providerpath ./java-csp-5.0.40621-A/JCSP.jar;./java-csp-5.0.40621-A/JCP.jar;./java-csp-5.0.40621-A/ASN1P.jar;./java-csp-5.0.40621-A/asn1rt.jar;./java-csp-5.0.40621-A/forms_rt.jar -alias keyonenineA -provider ru.CryptoPro.JCSP.JCSP -storetype HDIMAGE -keystore NONE -storepass 123456


Создаю JKS хранилище
Код:
keytool -genkeypair -keyalg RSA -alias newkey -keypass 123456 -keystore common.jks -storepass 123456 -dname "CN=TESTCN,O=Test,C=US" -validity 9999


Импортирую сертификат в JKS
Код:
keytool -importcert -file keyonenineA.cer -keystore common.jks -alias "keyonenineA"


Меняю код для TrustManager
Код:
  val trustManagerFactory: TrustManagerFactory = {
    val trustedKeyStore = KeyStore.getInstance("JKS")
    trustedKeyStore.load(new FileInputStream("common.jks"), "123456".toCharArray)
    val tmf = TrustManagerFactory.getInstance("GostX509")
    tmf.init(trustedKeyStore)
    tmf
  }


Ошибка в логах та же..

Оба приложения запускаются в докере, в каждый образ монтируется раздел с HDImageStore
Код:
volumes:
  - /var/opt/cprocsp/keys/user:/app/gost_store

При инициализации KeyStore обновляется путь до HDImageStore
Код:
HDImageStore.setDir("/app/gost_store")

Отредактировано пользователем 20 ноября 2020 г. 12:55:25(UTC)  | Причина: Не указана

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