Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Здравствуйте. Автор: 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). |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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, тоже не срабатывает
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Попробуйте .protocols("TLSv1") |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.10.2020(UTC) Сообщений: 29
Сказал(а) «Спасибо»: 5 раз
|
Автор: Евгений Афанасьев  Попробуйте .protocols("TLSv1") Сработало, ещё такое же поведение, если вообще не указывать никакой протокол. Сначала ворнинги, потом ошибки уже при хендшейке с другим инстансом приложения.
Код:2020-11-19 08:56:39,938 WARN [nio-worker-group-4-1] i.n.c.AbstractChannelHandlerContext - An exception 'java.lang.IllegalStateException: Promise already completed.' [enable DEBUG level for full stacktrace] was thrown by a user handler's exceptionCaught() method while handling the following exception:
io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Received fatal alert: handshake_failure
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:475)
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:408)
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:375)
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:358)
at io.netty.handler.ssl.SslHandler.channelInactive(SslHandler.java:1075)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:243)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:236)
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:243)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:236)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1417)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:257)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:243)
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:913)
at io.netty.channel.AbstractChannel$AbstractUnsafe$8.run(AbstractChannel.java:819)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518)
at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: javax.net.ssl.SSLException: Received fatal alert: handshake_failure
at ru.CryptoPro.ssl.cl_2.a(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.a(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.a(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.j(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.b(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.a(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.unwrap(Unknown Source)
at java.base/javax.net.ssl.SSLEngine.unwrap(Unknown Source)
at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:282)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1329)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1224)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1271)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444)
... 24 common frames omitted
2020-11-19 08:56:40,158 WARN [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - %% No alias is match
2020-11-19 08:56:40,161 WARN [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - %% No alias is match
2020-11-19 08:56:40,163 WARN [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - %% No alias is match
2020-11-19 08:56:40,167 WARN [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - %% No alias is match
2020-11-19 08:56:40,170 ERROR [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - nio-worker-group-4-4, fatal error: 40: no cipher suites in common
javax.net.ssl.SSLHandshakeException: no cipher suites in common
at ru.CryptoPro.ssl.cl_2.a(Unknown Source)
at ru.CryptoPro.ssl.SSLEngineImpl.a(Unknown Source)
at ru.CryptoPro.ssl.cl_57.a(Unknown Source)
at ru.CryptoPro.ssl.cl_57.a(Unknown Source)
at ru.CryptoPro.ssl.cl_94.b(Unknown Source)
at ru.CryptoPro.ssl.cl_94.a(Unknown Source)
at ru.CryptoPro.ssl.cl_94.a(Unknown Source)
at ru.CryptoPro.ssl.cl_57.w(Unknown Source)
at ru.CryptoPro.ssl.cl_58.a(Unknown Source)
at ru.CryptoPro.ssl.cl_58.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at ru.CryptoPro.ssl.cl_59.run(Unknown Source)
at io.netty.handler.ssl.SslHandler.runAllDelegatedTasks(SslHandler.java:1499)
at io.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:1513)
at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1397)
at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1224)
at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1271)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514)
at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Unknown Source)
2020-11-19 08:56:40,176 ERROR [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - nio-worker-group-4-4 fatal: engine already closed. Rethrowing
2020-11-19 08:56:40,180 ERROR [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - javax.net.ssl.SSLHandshakeException: no cipher suites in common
2020-11-19 08:56:40,184 ERROR [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - nio-worker-group-4-4 fatal: engine already closed. Rethrowing
2020-11-19 08:56:40,187 ERROR [nio-worker-group-4-4] ru.CryptoPro.ssl.SSLLogger - javax.net.ssl.SSLException: Inbound closed before receiving peer's close_notify: possible truncation attack?
2020-11-19 08:56:40,201 ERROR [nio-worker-group-4-2] ru.CryptoPro.ssl.SSLLogger - nio-worker-group-4-2 fatal: engine already closed. Rethrowing
2020-11-19 08:56:40,203 ERROR [nio-worker-group-4-2] ru.CryptoPro.ssl.SSLLogger - javax.net.ssl.SSLException: Received fatal alert: handshake_failure
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
%% No alias is match А контейнер сделали для клиента/сервера? Смотря что у вас. Для сервера - обязательно (сертификат с использованием ключа "Аутентификация сервера"), для клиента - если на сервере включена клиентская аутентификация (сертификат с использованием ключа "Аутентификация клиента"). Контейнер с паролем. В SSLContext надо подавать тип хранилища с паролем для контенйнера, чтобы он был выбран. И права у приложения должны быть для доступа к контейнеру. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
1. У trustManagerFactory должен быть свой keystore с корневым сертификатом другой стороны, то есть некое хранилище доверенных корневых. 2. По логам был поиск подходящего сертификата, но ничего не найдено. Либо пароль 123456 не подходит к контейнеру, либо у пользователя, под которым запущено приложение, нет ключевых контейнеров, либо сертификат в контейнере с паролем 123456 отсутствует или просрочнен. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close