如何避免Diffie-Hellman与Java/Netty进行SSL连接?

Mat*_*ias 5 java ssl netty

我在基于Java的Usenet客户端中使用Netty作为后端.该库工作正常,但在某些情况下我无法通过SSL连接到远程服务器,因为这个错误:

Java:为什么SSL握手会给出"无法生成DH密钥对"的异常?

不幸的是,似乎无论出于何种原因,这个Java错误仍然没有被修复.由于远程服务器不在我的控制之下,我需要一个解决方法.根据上面的链接,一个这样的"解决方案"是在SSL握手期间避免DH(不是很漂亮,但可能比没有好).

但是,我不是SSL专家,所以我不确定如何在Netty中实现它; 或更好:在我的基于Netty的解决方案中.到现在为止我正在创建连接:

// configure the Netty client
ClientBootstrap bootstrap = new ClientBootstrap(clSockChannelFactory);

// configure the pipeline factory
bootstrap.setPipelineFactory(channelPipelineFactory);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
bootstrap.setOption("child.receiveBufferSizePredictorFactory", 
          new AdaptiveReceiveBufferSizePredictorFactory());

// start the connection attempt
InetSocketAddress isa = new InetSocketAddress(serverAddress, port);
ChannelFuture future = bootstrap.connect(isa);
...
channel = future.getChannel();
...
Run Code Online (Sandbox Code Playgroud)

好的,没关系,但在我连接SSL套接字之前,哪里可以禁用密码套件,如上面的线程中所描述的那样?

在此先感谢您的帮助!

亲切的问候,马蒂亚斯

PS:那么,为什么这个问题还没有在Java中得到解决呢?

Bru*_*uno 2

我不熟悉 Netty,但我建议遵循安全聊天示例中的方法。

我不确定您有什么默认的 SSL/TLS 密钥/信任设置,但如果您没有自定义SSLContext,请尝试SSLContext.getDefault()

然后,创建一个SSLEngine使用SSLContext.createSSLEngine(). 此时SSLEngine,您应该能够启用您想要的密码套件。假设您使用的是 Oracle JRE(或 OpenJDK),您将在 Sun Provider 文档中找到密码套件列表

在此之后(这是 Netty 特定的部分),设置一个SslHandler像这样的 using (参见 Netty 示例):

pipeline.addLast("ssl", new SslHandler(engine));
Run Code Online (Sandbox Code Playgroud)