I use Jetty with HTTPS and a valid certificate, and I'm not sure that everything is correct, because the server logs have the SSL_NULL_WITH_NULL_NULL set. However, customer logs look good.
Long story: I am adding a Java example that expects Jetty-7.6.10, and two scripts to create a keystore and trust.
JettyHttpsForStackOverflow launches the client and server together or separately to deactivate logs.
create-chains.sh script creates a keystore and trust store. The keystore contains a chain ending with a root certificate authority created from a temporary keystore. It replicates a real case with a certification authority and intermediate certificates.
create-single-autosigned.sh script creates a keystore and trust store too, but with a self-signed certificate.
Note that SSL_NULL_WITH_NULL_NULL displayed as a set of server ciphers with both certificate chains.
I think there is no problem with the server domain name. I get the same problem with a server running on a machine with a domain name corresponding to a distinguished name in a correctly signed certificate. SSLLab has confirmed that SSL is working fine on my server (class B) and Google Chrome is connecting successfully.
I think there is no problem with the Jetty client. When I use it, it just calls the SSLContextFactory , which I create to create the SSLSocket . Surprisingly, in the Jetty client TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA appears to be the cipher suite used.
Is it OK to get SSL_NULL_WITH_NULL_NULL in Jetty Server Logs? If not, how to do it right?
create-single-autosigned.sh
#!/bin/bash rm their-keystore.jks 2> /dev/null rm my-keystore.jks 2> /dev/null rm my-truststore.jks 2> /dev/null echo "====================================================" echo "Creating fake third-party chain ca2 -> ca1 -> ca ..." echo "====================================================" keytool -genkeypair -alias ca -dname cn=ca \ -validity 10000 -keyalg RSA -keysize 2048 \ -ext BasicConstraints:critical=ca:true,pathlen:10000 \ -keystore their-keystore.jks -keypass Keypass -storepass Storepass keytool -genkeypair -alias ca1 -dname cn=ca1 \ -validity 10000 -keyalg RSA -keysize 2048 \ -keystore their-keystore.jks -keypass Keypass -storepass Storepass keytool -genkeypair -alias ca2 -dname cn=ca2 \ -validity 10000 -keyalg RSA -keysize 2048 \ -keystore their-keystore.jks -keypass Keypass -storepass Storepass keytool -certreq -alias ca1 \ -keystore their-keystore.jks -keypass Keypass -storepass Storepass \ | keytool -gencert -alias ca \ -ext KeyUsage:critical=keyCertSign \ -ext SubjectAlternativeName=dns:ca1 \ -keystore their-keystore.jks -keypass Keypass -storepass Storepass \ | keytool -importcert -alias ca1 \ -keystore their-keystore.jks -keypass Keypass -storepass Storepass
create-single-autosigned.sh
#!/bin/bash rm my-keystore.jks 2> /dev/null rm my-truststore.jks 2> /dev/null keytool -genkeypair -alias e1 -dname cn=e1 \ -validity 10000 -keyalg RSA -keysize 2048 \ -keystore my-keystore.jks -keypass Keypass -storepass Storepass keytool -list -v -storepass Storepass -keystore my-keystore.jks echo "=================================================" echo "Keystore generated. Now generating truststore ..." echo "=================================================" read -p "Press a key to continue." keytool -exportcert -alias e1 \ -keystore my-keystore.jks -keypass Keypass -storepass Storepass \ | keytool -importcert -noprompt -alias e1 \ -keystore my-truststore.jks -keypass Keypass -storepass Storepass keytool -list -v -storepass Storepass -keystore my-truststore.jks
JettyHttpsForStackOverflow.java
import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import org.eclipse.jetty.client.ContentExchange; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ssl.SslSelectChannelConnector; import org.eclipse.jetty.util.ssl.SslContextFactory; public class JettyHttpsForStackOverflow { public static void main( final String... arguments ) throws Exception { System.setProperty( "javax.net.debug", "all" ) ; try { if( arguments.length == 0 || "server".equals( arguments[ 0 ] ) ) { runServer() ; } if( arguments.length == 0 || "client".equals( arguments[ 0 ] ) ) { runClient() ; } } catch( Exception e ) { e.printStackTrace() ; System.exit( 1 ) ;