【问题标题】:How to avoid Diffie-Hellman for SSL connections with Java/Netty?如何避免使用 Java/Netty 进行 SSL 连接的 Diffie-Hellman?
【发布时间】:2012-04-19 15:21:35
【问题描述】:

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

Java: Why does SSL handshake give 'Could not generate DH keypair' exception?

不幸的是,无论出于何种原因,这个 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();
...

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

提前感谢您的帮助!

亲切的问候,马蒂亚斯

PS:顺便问一下,为什么这个问题还没有在 Java 中得到解决?

【问题讨论】:

    标签: java ssl netty


    【解决方案1】:

    我不熟悉 Netty,但我建议遵循 secure chat example 中的方法。

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

    然后,使用SSLContext.createSSLEngine() 创建一个SSLEngine。在这个SSLEngine,你应该可以enable the cipher suites you want。假设您使用的是 Oracle JRE(或 OpenJDK),您会找到 list of cipher suites in the Sun Provider documentation

    在此之后(这是特定于 Netty 的部分),使用类似这样的方式设置 SslHandler(参见 Netty 示例):

    pipeline.addLast("ssl", new SslHandler(engine));
    

    【讨论】:

    • 非常感谢,伙计。这正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多