2012-04-05 1 views
4

Ich verwende Netty als Backend in einem Java-basierten Usenet-Client. Die Bibliothek arbeitet gut, aber unter bestimmten Umständen kann ich nicht an einen Remote-Server über SSL-Verbindung, weil genau dieser Fehler:Wie vermeidet man Diffie-Hellman für SSL-Verbindungen mit Java/Netty?

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

Leider scheint es, dass nach wie vor aus welchem ​​Grund diese Java-Fehler wurde noch nicht behoben. Und da der Remote-Server nicht unter meiner Kontrolle ist, brauche ich hier eine Abhilfe. Eine solche "Lösung", gemäß dem obigen Link, besteht darin, DH während des SSL-Handshakes überhaupt zu vermeiden (nicht sehr hübsch, aber vielleicht besser als nichts).

Allerdings bin ich kein SSL-Experte, also bin ich mir nicht wirklich sicher, wie ich das in Netty umsetzen kann; oder besser: in meiner Lösung, die auf Netty basiert. Inzwischen bin ich zu schaffen Verbindungen wie folgt aus:

// 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(); 
... 

Ok, das ist in Ordnung, aber wo kann ich Chiffriersätze deaktivieren, bevor ich die SSL-Socket-Verbindung, wie oben im Thread desribed?

Vielen Dank im Voraus für Ihre Hilfe!

Mit freundlichen Grüßen, Matthias

PS: Übrigens, irgendwelche Ideen, warum dieses Problem in Java noch nicht angesprochen wurde?

Antwort

2

Ich bin nicht mit Netty vertraut, aber ich würde vorschlagen, den Ansatz in der secure chat example zu folgen.

Ich bin mir nicht sicher, welche SSL/TLS-Standardschlüssel/Vertrauenseinstellungen Sie haben, aber wenn Sie keine benutzerdefinierte SSLContext haben, versuchen Sie SSLContext.getDefault().

Dann erstellen Sie eine SSLEngine mit SSLContext.createSSLEngine(). Auf diesem SSLEngine sollten Sie in der Lage sein, enable the cipher suites you want. Angenommen, Sie verwenden die Oracle JRE (oder OpenJDK), finden Sie die list of cipher suites in the Sun Provider documentation.

Danach (dies ist die Netty spezifischen Teil), stellen ein SslHandler so etwas wie dies (siehe Netty Beispiel):

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

Vielen Dank, Kumpel. Genau das habe ich gesucht! – Matthias

Verwandte Themen