Hi Marc, thanks for the attention. <div><br></div><div>I never did figure out why this didn&#39;t work. I reverted back to manually instantiating my keystores and instantiating KeyManagers and TrustManagers as the Netty example code does (this works). To anyone else having the same problem, here&#39;s what I basically ended up with:</div>

<div><br></div><div><div>TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(&quot;PKIX&quot;);</div><div>KeyStore tmpKS = null;</div><div>tmFactory.init(tmpKS);</div><div>        </div><div>KeyStore ks = KeyStore.getInstance(&quot;JKS&quot;);</div>

<div>ks.load(new FileInputStream(System.getProperty(&quot;javax.net.ssl.keyStore&quot;)), System.getProperty(&quot;javax.net.ssl.keyStorePassword&quot;).toCharArray());</div><div><br></div><div>// Set up key manager factory to use our key store</div>

<div>KeyManagerFactory kmf = KeyManagerFactory.getInstance(&quot;SunX509&quot;);</div><div>kmf.init(ks, System.getProperty(&quot;javax.net.ssl.keyStorePassword&quot;).toCharArray());</div><div><br></div><div>KeyManager[] km = kmf.getKeyManagers();</div>

<div>TrustManager[] tm = tmFactory.getTrustManagers();</div><div><br></div><div>SSLContext sslContext = SSLContext.getInstance(&quot;TLS&quot;);</div><div>sslContext.init(km, tm, null);</div><div>SSLEngine engine = sslContext.createSSLEngine();</div>

<div><br></div><div>And this works just fine.</div><div><br></div><div><br></div><div class="gmail_quote">2010/11/29 Marc-André Laverdière <span dir="ltr">&lt;<a href="mailto:marcandre.laverdiere@gmail.com" target="_blank">marcandre.laverdiere@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<br>
<br>
I don&#39;t see any problems with the code itself... only that you are<br>
using the system-default keystore and trust store. That is not wrong<br>
in itself, but I don&#39;t think of that as scaling smoothly if you have<br>
multiple applications running on the same machine.<br>
<br>
The problem is not netty-specific, it has everything to do with the<br>
SSL implementation in Java.<br>
<br>
Which keys are you using, RSA or DH/DHE? Are you on TLSv1 or SSLv3?<br>
What is the client&#39;s SSL library?<br>
<br>
I remember that, in my case, after disabling all the weak(er) suites,<br>
I was down to only one possible option!!! It might be something<br>
similar for you, and the other side maybe doesn&#39;t support it.<br>
<br>
Regards,<br>
<br>
Marc-André LAVERDIÈRE<br>
&quot;Perseverance must finish its work so that you may be mature and<br>
complete, not lacking anything.&quot; -James 1:4<br>
<a href="http://asimplediscipleslife.blogspot.com/" target="_blank">http://asimplediscipleslife.blogspot.com/</a><br>
<a href="http://mlaverd.theunixplace.com" target="_blank">mlaverd.theunixplace.com</a><br>
<br>
<br>
<br>
2010/11/19 Mathew Johnston &lt;<a href="mailto:mjohnston@capsaicin.ca" target="_blank">mjohnston@capsaicin.ca</a>&gt;:<br>
<div><div></div><div>&gt; Hi,<br>
&gt; I&#39;m trying to develop my first high performance HTTPS based application<br>
&gt; using Netty, starting with the SecureChat and HTTP server examples. I<br>
&gt; noticed that the examples use a dummy implementation of TrustManager and<br>
&gt; load a KeyStore from a short[]. I assume that this is simply to make it<br>
&gt; convenient to get a working example to run. E.g. remove the need for someone<br>
&gt; to create a trust/key store before running the example.<br>
&gt; I&#39;d like my app to use the default TrustStore/KeyStore loading from file<br>
&gt; (using system properties for config), as well as the standard certificate<br>
&gt; trust checks but am having trouble making the necessary modification. I kind<br>
&gt; of assumed that I could just pass SSLContext.init() some nulls and it would<br>
&gt; make sensible default choices, but I&#39;m getting a &quot;no cipher suites in<br>
&gt; common&quot; exception.<br>
&gt; Here&#39;s a snippit of the code I&#39;m using (a modification of<br>
&gt; HttpServerPipelineFactory from the examples):<br>
&gt;<br>
&gt;         // Create a default pipeline implementation.<br>
&gt;         ChannelPipeline pipeline = pipeline();<br>
&gt;         // Create TrustManagerFactory for PKIX-compliant trust managers<br>
&gt;         TrustManagerFactory factory =<br>
&gt; TrustManagerFactory.getInstance(&quot;PKIX&quot;);<br>
&gt;         KeyStore ks = null;<br>
&gt;         factory.init(ks);<br>
&gt;         SSLContext sslContext = SSLContext.getInstance(&quot;TLS&quot;);<br>
&gt;<br>
&gt;         sslContext.init(null, factory.getTrustManagers(), null);<br>
&gt;         TrustManager[] managers = factory.getTrustManagers();<br>
&gt;         for (TrustManager m : managers) {<br>
&gt;          X509TrustManager mgr = (X509TrustManager)m;<br>
&gt;          for (X509Certificate c : mgr.getAcceptedIssuers()) {<br>
&gt;          System.out.println(&quot;DEBUG: Trusted Certificate: &quot; +<br>
&gt; c.getSubjectDN());<br>
&gt;          }<br>
&gt;         }<br>
&gt;<br>
&gt;         SSLEngine engine = sslContext.createSSLEngine();<br>
&gt;         for (String suite : engine.getEnabledCipherSuites()) {<br>
&gt;          System.out.println(&quot;DEBUG: Enabled cipher: &quot; + suite);<br>
&gt;         }<br>
&gt;         engine.setUseClientMode(false);<br>
&gt;<br>
&gt;         pipeline.addLast(&quot;ssl&quot;, new SslHandler(engine));<br>
&gt;<br>
&gt; When running this, I do see my loaded CA certificate (TrustStore) printed.<br>
&gt; I&#39;m not sure how to easily enumerate the private keys that are loaded, but I<br>
&gt; assume they&#39;re loaded as well. The ciphers enabled include:<br>
&gt; SSL_RSA_WITH_RC4_128_MD5<br>
&gt; SSL_RSA_WITH_RC4_128_SHA<br>
&gt; TLS_RSA_WITH_AES_128_CBC_SHA<br>
&gt; TLS_DHE_RSA_WITH_AES_128_CBC_SHA<br>
&gt; TLS_DHE_DSS_WITH_AES_128_CBC_SHA<br>
&gt; SSL_RSA_WITH_3DES_EDE_CBC_SHA<br>
&gt; SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA<br>
&gt; SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA<br>
&gt; SSL_RSA_WITH_DES_CBC_SHA<br>
&gt; SSL_DHE_RSA_WITH_DES_CBC_SHA<br>
&gt; SSL_DHE_DSS_WITH_DES_CBC_SHA<br>
&gt; SSL_RSA_EXPORT_WITH_RC4_40_MD5<br>
&gt; SSL_RSA_EXPORT_WITH_DES40_CBC_SHA<br>
&gt; SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA<br>
&gt; SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA<br>
&gt; TLS_EMPTY_RENEGOTIATION_INFO_SCSV<br>
&gt; When I try to connect, I get the following exception:<br>
&gt; javax.net.ssl.SSLHandshakeException: no cipher suites in common<br>
&gt;         at com.sun.net.ssl.internal.ssl.Handshaker.checkThrown(Unknown<br>
&gt; Source)<br>
&gt;         at<br>
&gt; com.sun.net.ssl.internal.ssl.SSLEngineImpl.checkTaskThrown(Unknown Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.SSLEngineImpl.readNetRecord(Unknown<br>
&gt; Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.SSLEngineImpl.unwrap(Unknown Source)<br>
&gt;         at javax.net.ssl.SSLEngine.unwrap(Unknown Source)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:868)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.ssl.SslHandler.decode(SslHandler.java:605)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.codec.frame.FrameDecoder.callDecode(FrameDecoder.java:282)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.codec.frame.FrameDecoder.messageReceived(FrameDecoder.java:216)<br>
&gt;         at<br>
&gt; org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)<br>
&gt;         at<br>
&gt; org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)<br>
&gt;         at<br>
&gt; org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:350)<br>
&gt;         at<br>
&gt; org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:281)<br>
&gt;         at<br>
&gt; org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:201)<br>
&gt;         at<br>
&gt; org.jboss.netty.util.internal.IoWorkerRunnable.run(IoWorkerRunnable.java:46)<br>
&gt;         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown<br>
&gt; Source)<br>
&gt;         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown<br>
&gt; Source)<br>
&gt;         at java.lang.Thread.run(Unknown Source)<br>
&gt; Caused by: javax.net.ssl.SSLHandshakeException: no cipher suites in common<br>
&gt;         at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown<br>
&gt; Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.SSLEngineImpl.fatal(Unknown Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)<br>
&gt;         at<br>
&gt; com.sun.net.ssl.internal.ssl.ServerHandshaker.chooseCipherSuite(Unknown<br>
&gt; Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.ServerHandshaker.clientHello(Unknown<br>
&gt; Source)<br>
&gt;         at<br>
&gt; com.sun.net.ssl.internal.ssl.ServerHandshaker.processMessage(Unknown Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown<br>
&gt; Source)<br>
&gt;         at com.sun.net.ssl.internal.ssl.Handshaker$1.run(Unknown Source)<br>
&gt;         at java.security.AccessController.doPrivileged(Native Method)<br>
&gt;         at com.sun.net.ssl.internal.ssl.Handshaker$DelegatedTask.run(Unknown<br>
&gt; Source)<br>
&gt;         at org.jboss.netty.handler.ssl.SslHandler$2.run(SslHandler.java:999)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.ssl.ImmediateExecutor.execute(ImmediateExecutor.java:37)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.ssl.SslHandler.runDelegatedTasks(SslHandler.java:996)<br>
&gt;         at<br>
&gt; org.jboss.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:886)<br>
&gt;         ... 12 more<br>
&gt; I saw <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6448723" target="_blank">http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6448723</a> and wonder<br>
&gt; if my issue may be related. Would SSLContext.init() be initializing with an<br>
&gt; X509KeyManager instead of an X509ExtendedKeyManager as the bug report<br>
&gt; suggests I would require? If so, is there a convenient way of getting around<br>
&gt; this issue while maintaining the default keystore loading behavior?<br>
&gt; Ultimately, I do want to validate the client certificate when it connects,<br>
&gt; if that changes anything.<br>
&gt; I very much appreciate the attention you&#39;ve given if you&#39;ve made it this far<br>
&gt; :) Thanks!<br>
&gt; Mathew Johnston<br>
</div></div>&gt; _______________________________________________<br>
&gt; netty-users mailing list<br>
&gt; <a href="mailto:netty-users@lists.jboss.org" target="_blank">netty-users@lists.jboss.org</a><br>
&gt; <a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a><br>
&gt;<br>
<br>
_______________________________________________<br>
netty-users mailing list<br>
<a href="mailto:netty-users@lists.jboss.org" target="_blank">netty-users@lists.jboss.org</a><br>
<a href="https://lists.jboss.org/mailman/listinfo/netty-users" target="_blank">https://lists.jboss.org/mailman/listinfo/netty-users</a></blockquote></div><br>
</div>