Двухстороннее рукопожатие SSL с использованием Netty4 - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть сервер на базе netty4, принимающий https просто отлично. Сейчас я пытаюсь расширить сервер, чтобы разрешить проверку подлинности сертификатов клиентов.

            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
            keyStore.load(new FileInputStream(configuration.getProperty(Constants.CACERTS_PATH)),
                    configuration.getProperty(Constants.SSL_CERT_KEY_PASSWORD).toCharArray());

            TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            factory.init(keyStore);

            final SslContext sslCtx = SslContextBuilder.forServer(
                    new File(configuration.getProperty(Constants.SSL_CERT_PATH)),
                    new File(configuration.getProperty(Constants.SSL_CERT_KEY_PATH)),
                    configuration.getProperty(Constants.SSL_CERT_KEY_PASSWORD))
                    .clientAuth(ClientAuth.REQUIRE)
                    .trustManager(factory)
                    .build();

Мой сервер инициализируется следующим образом:

                    .childHandler(new ChannelInitializer<Channel>() {
                        @Override
                        protected void initChannel(Channel ch)  {
                            ChannelPipeline pipeline = ch.pipeline();
                            pipeline.addLast(sslContext.newHandler(ch.alloc()));
                            pipeline.addLast(new HttpRequestDecoder());
                            pipeline.addLast(new HttpResponseEncoder());
                            pipeline.addLast("inflate", new HttpContentDecompressor());
                            .....
                        }
                    })

Я готовлю хранилище доверия путем преобразования, следуя инструкциям здесь .

Когда я пытаюсь проверить свою реализацию, используя curl

curl --cacert certRepo -v https://mywebendpoint.com/

, на стороне сервера появляется следующая ошибка

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: error:100000c0:SSL routines:OPENSSL_internal:PEER_DID_NOT_RETURN_A_CERTIFICATE
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:748)

Я не уверен, как поступить отсюда, любая помощь будет высоко ценится. Если я что-то неправильно понял, пожалуйста, дайте мне знать.

Спасибо!

...