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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline artishok  
#1 Оставлено : 15 февраля 2024 г. 18:42:56(UTC)
artishok

Статус: Новичок

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

Добрый день!
Возникла необходимость объяснить netty о существовании гост алгоритмов, о которых netty не знает.
Сам netty работает с криптографией путем объявления SslContextBuilder, где заполняется приватный ключ и сертификат сервера.
Тип приватного ключа PrivateKey, из JDK. Каким образом передать в контекст приватный ключ?
Код:

var ks = KeyStore.getInstance(JCP.HD_STORE_NAME);
            ks.load(null, null);
            var cf = CertificateFactory.getInstance("X509");
            var cert = cf.generateCertificate(Files.newInputStream(Paths.get("path to certs")));

var sslContext = SslContextBuilder
                    .forServer(privateKey, cert)
                    .sslProvider(SslProvider.JDK)
                    .sslContextProvider(new Provider())
                    .trustManager(tmf)
                    .clientAuth(ClientAuth.REQUIRE)
                    .build();

Offline billGilbert  
#2 Оставлено : 19 февраля 2024 г. 14:44:37(UTC)
billGilbert

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

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

Сказал(а) «Спасибо»: 3 раз
Автор: artishok Перейти к цитате
Добрый день!
Возникла необходимость объяснить netty о существовании гост алгоритмов, о которых netty не знает.
Сам netty работает с криптографией путем объявления SslContextBuilder, где заполняется приватный ключ и сертификат сервера.
Тип приватного ключа PrivateKey, из JDK. Каким образом передать в контекст приватный ключ?
Код:

var ks = KeyStore.getInstance(JCP.HD_STORE_NAME);
            ks.load(null, null);
            var cf = CertificateFactory.getInstance("X509");
            var cert = cf.generateCertificate(Files.newInputStream(Paths.get("path to certs")));

var sslContext = SslContextBuilder
                    .forServer(privateKey, cert)
                    .sslProvider(SslProvider.JDK)
                    .sslContextProvider(new Provider())
                    .trustManager(tmf)
                    .clientAuth(ClientAuth.REQUIRE)
                    .build();



А там разве нету поля keyManager куда вы можете передать приватный ключ, который вы вычитали из хранилища?
Offline artishok  
#3 Оставлено : 21 февраля 2024 г. 10:30:06(UTC)
artishok

Статус: Новичок

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

Что было сделано:
сгенерированы корневой, серверный, клиентский сертификаты по мануалу .
Код:

csptest -minica -root -dn "CN=example.com" -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" -container "CA" -password "123456" -store mRoot -fcert C:\root.cer
csptest -minica -leaf -dn "CN=server.example.com" -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" -container "server" -password "123456" -fcert C:\server.cer -issuer "CN=example.com" -ipassword "123456" -istore mRoot
csptest -minica -leaf -dn "CN=client.example.com" -provtype 80 -provider "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" -container "client" -password "123456" -fcert C:\client.cer -issuer "CN=example.com" -ipassword "123456" -istore mRoot



Это видится в консоли JCP крипто про.
Был создан контейнер в который добавлен корневой сертификаты.
Создается контекст для Netty
Код:

//инициализация сервера
        Security.addProvider(new JCP());
        Security.addProvider(new RevCheck());
        Security.addProvider(new CryptoProvider());
        Security.addProvider(new Provider());
        var provider = new Provider();
            var ts = KeyStore.getInstance(HD_STORE_NAME);
            ts.load(Files.newInputStream(Paths.get("ca.store")), certs.getTrustStorePassword().toCharArray());
            var tmf = TrustManagerFactory.getInstance(TRUSTMANGER_ALG);
            tmf.init(ts);
            var ks = KeyStore.getInstance(HD_STORE_NAME);
            ks.load(new StoreInputStream("server"), null);
            var kmf = KeyManagerFactory.getInstance(KEYMANGER_ALG);
            kmf.init(ks, "123456".toCharArray());
            return SslContextBuilder.forServer(kmf)
                    .trustManager(tmf)
                    .protocols("TLSv1")
                    .sslContextProvider(provider)
                    .clientAuth(ClientAuth.REQUIRE)
                    .build();




Код:

//инициализация клиента 
        Security.addProvider(new JCP());
        Security.addProvider(new RevCheck());
        Security.addProvider(new CryptoProvider());
        Security.addProvider(new Provider());
        var provider = new Provider();
        var ts = KeyStore.getInstance(HD_STORE_NAME);
        ts.load(Files.newInputStream(Paths.get("ca.store")), "123456".toCharArray());
        var tmf = TrustManagerFactory.getInstance(TRUSTMANGER_ALG);
        tmf.init(ts);
        var ks = KeyStore.getInstance(HD_STORE_NAME);
        ks.load(new StoreInputStream("client"), null);
        var kmf = KeyManagerFactory.getInstance(KEYMANGER_ALG);
        kmf.init(ks, "123456".toCharArray());
        return SslContextBuilder.forClient()
                .trustManager(tmf)
                .keyManager(kmf)
                .protocols("TLSv1")
                .sslContextProvider(provider)
                .build();

Ошибка на клиенте при подключении
Код:

java.lang.RuntimeException: Delegated task threw Exception/Error
	at ru.CryptoPro.ssl.cl_64.B(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.SSLEngineImpl.e(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.SSLEngineImpl.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.SSLEngineImpl.unwrap(Unknown Source) ~[cpSSL.jar:42646-A]
	at java.base/javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:637) ~[na:na]
	at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:310) ~[netty-handler-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1445) ~[netty-handler-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1338) ~[netty-handler-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1387) ~[netty-handler-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529) ~[netty-codec-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468) ~[netty-codec-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290) ~[netty-codec-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.101.Final.jar:4.1.101.Final]
	at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
Caused by: java.lang.NullPointerException: null
	at ru.CryptoPro.ssl.util.IPAddressUtil.textToNumericFormatV4(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.util.IPAddressUtil.isIPv4LiteralAddress(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.util.HostnameChecker.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.util.HostnameChecker.match(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_120.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_120.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_120.checkServerTrusted(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_18.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_18.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_64.u(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_65.a(Unknown Source) ~[cpSSL.jar:42646-A]
	at ru.CryptoPro.ssl.cl_65.run(Unknown Source) ~[cpSSL.jar:42646-A]
	at java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na]
	at ru.CryptoPro.ssl.cl_66.run(Unknown Source) ~[cpSSL.jar:42646-A]
	at io.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:1651) ~[netty-handler-4.1.101.Final.jar:4.1.101.Final]
	at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1497) ~[netty-handler-4.1.101.Final.jar:4.1.101.Final]
	... 21 common frames omitted


дистрибутив КриптоПро JCP и JTLS R5 (2.0.42646-А для JVM 10+), (2.0.41940-А для JVM 10+) ошибка воспроизводится всегда.
похожая ошибка с проверкой textToNumericFormatV4 https://bugs.openjdk.org/browse/JDK-8211339
Можете помочь в исправлении данной ошибки?

Отредактировано пользователем 22 февраля 2024 г. 18:42:36(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 28 февраля 2024 г. 17:39:53(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Здравствуйте.
Сертификат сервера можете приложить?
Offline artishok  
#5 Оставлено : 29 февраля 2024 г. 10:32:36(UTC)
artishok

Статус: Новичок

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

Добрый день.
Отправил в ЛС
Offline Санчир Момолдаев  
#6 Оставлено : 29 февраля 2024 г. 16:24:53(UTC)
Санчир Момолдаев

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

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,040
Российская Федерация

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 226 раз в 213 постах
вопрос рассматривается в рамках обращения на портале 112937
Техническую поддержку оказываем тут
Наша база знаний
Offline artishok  
#7 Оставлено : 7 марта 2024 г. 10:14:44(UTC)
artishok

Статус: Новичок

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

Черновая версия для запуска контекста Netty
Код:

        var provider = new Provider();
        var ts = KeyStore.getInstance(CERT_STORE_NAME);
        ts.load(Files.newInputStream(Paths.get("test.store")), "123456".toCharArray());
        var tmf = TrustManagerFactory.getInstance(TRUSTMANGER_ALG);
        tmf.init(ts);
        var ks = KeyStore.getInstance(HD_STORE_NAME);
        ks.load(new StoreInputStream("server"), null);
        var kmf = KeyManagerFactory.getInstance(KEYMANGER_ALG);
        kmf.init(ks, "123456".toCharArray());
        return SslContextBuilder.forServer(kmf)
                .trustManager(tmf)
                .protocols(List.of("TLSv1","TLSv1.1","TLSv1.2"))
                .sslContextProvider(provider)
                .clientAuth(ClientAuth.REQUIRE)
                .build();

Код:

        var provider = new Provider();
        var ts = KeyStore.getInstance(CERT_STORE_NAME);
        ts.load(Files.newInputStream(Paths.get("ca.store")), "123456".toCharArray());
        var tmf = TrustManagerFactory.getInstance(TRUSTMANGER_ALG);
        tmf.init(ts);
        var ks = KeyStore.getInstance(HD_STORE_NAME);
        ks.load(new StoreInputStream("client"), null);
        var kmf = KeyManagerFactory.getInstance(KEYMANGER_ALG);
        kmf.init(ks, "123456".toCharArray());
        return SslContextBuilder.forClient()
                .trustManager(tmf)
                .keyManager(kmf)
                .protocols(List.of("TLSv1","TLSv1.1","TLSv1.2"))
                .sslContextProvider(provider)
                .build();

ca.store содержит корневой сертификат. Запуск с ключом -Dtls_prohibit_disabled_validation=false (через свойства не подхватывается). В панели JCP так же отключена проверка CRL.
Проверка хоста и первоначальная ошибка возникает при проверке хоста на клиенте, нужно добавить этот хост в обработчик Netty context.newHandler(ch.alloc(), "server.example.com", 12345)

Отредактировано пользователем 7 марта 2024 г. 12:22:43(UTC)  | Причина: Не указана

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