首页 > 解决方案 > netty sslcontextbuilder 收到 ClientHello 时服务器 sslcontext 异常

问题描述

缩小问题范围后编辑

我目前正在尝试在 FIPS 模式下(来自 bctls-fips 1.0.11)使用 Bouncycastle 的 JSSE 提供程序和 Java 15.0.1 上的 netty 的 sslbuildercontext(4.1.58.Final)来创建服务器 SSL 上下文。当服务器启动并绑定到一个端口时,在收到 ClientHello 时抛出以下异常:

io.netty.handler.codec.DecoderException: java.lang.NullPointerException: Cannot invoke "org.bouncycastle.tls.TlsContext.getSecurityParameters()" because the return value of "org.bouncycastle.tls.TlsProtocol.getContext()" is null
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:478)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)

创建服务器 sslcontext 的代码如下:

  val sslContext = SslContextBuilder.forServer(keyMgrFact)
    .trustManager(trustMgrFact)
    .keyManager(keyMgrFact)
    .clientAuth(ClientAuth.REQUIRE)
    .build

其中 keyMgrFact 和 trustMgrFact 利用 BCJSSE PXIK 实例。

我想知道我是否错过了在 sslcontextbuilder 上调用任何其他方法,因为问题似乎是 netty 没有正确使用 bouncycastle 设置底层 TLS 上下文。

标签: javanettybouncycastlefips

解决方案


推荐阅读