2012-04-05 43 views
4

我在基於Java的Usenet客戶端中使用Netty作爲後端。然而,圖書館工作正常,在某些情況下無法通過SSL連接到遠程服務器,因爲正是這種錯誤的:如何避免Diffie-Hellman與Java/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插座,如desribed在紗線之上?

在此先感謝您的幫助!

親切的問候,馬蒂亞斯

PS:順便說一下,爲什麼這個問題一直沒有在Java中尚未解決的任何想法?

回答

2

我對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

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

非常感謝,配合:

在此之後(這是Netty的特定部分),採用這樣的(見例如的Netty)設置SslHandler。這正是我所期待的! – Matthias 2012-04-05 22:30:15