diff --git a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java index 5f240614a..03f03d6cc 100644 --- a/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java +++ b/mina-core/src/test/java/org/apache/mina/filter/ssl/SslIdentificationAlgorithmTest.java @@ -31,8 +31,11 @@ import org.apache.mina.util.AvailablePortFinder; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SNIHostName; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLParameters; @@ -40,6 +43,9 @@ import java.net.InetSocketAddress; import java.security.KeyStore; import java.security.Security; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -57,6 +63,7 @@ * client-san-ext.truststore - keystore with trusted certificate * */ +@RunWith(Parameterized.class) public class SslIdentificationAlgorithmTest { private static final String KEY_MANAGER_FACTORY_ALGORITHM; @@ -71,24 +78,37 @@ public class SslIdentificationAlgorithmTest { KEY_MANAGER_FACTORY_ALGORITHM = algorithm; } + @Parameterized.Parameters(name = "{0}") + public static List getParameters() { + return Arrays.asList(new Object[][]{{"TLSv1.2"}, {"TLSv1.3"}}); + } + + private final String enabledProtocol; private int port; private CountDownLatch handshakeDone; - - private class CustomSslFilter extends SslFilter { + + public SslIdentificationAlgorithmTest(String enabledProtocol) { + this.enabledProtocol = enabledProtocol; + } + + private static class CustomSslFilter extends SslFilter { public CustomSslFilter(SSLContext sslContext) { super(sslContext); } protected SSLEngine createEngine(IoSession session, InetSocketAddress addr) { //Add your SNI host name and port in the IOSession - String sniHostNames = (String)session.getAttribute( "SNIHostNames" ); + String sniHostName = (String)session.getAttribute( "SNIHostNames" ); int portNumber = (int)session.getAttribute( "PortNumber"); - InetSocketAddress peer = new InetSocketAddress( sniHostNames, portNumber); - + SSLEngine sslEngine; - - if (addr != null) { + + if (addr != null && sniHostName != null) { + // Use createUnresolved to avoid blocking DNS lookup on the I/O thread + InetSocketAddress peer = InetSocketAddress.createUnresolved(sniHostName, portNumber); sslEngine = sslContext.createSSLEngine(peer.getHostName(), peer.getPort()); + } else if (addr != null) { + sslEngine = sslContext.createSSLEngine(addr.getHostString(), addr.getPort()); } else { sslEngine = sslContext.createSSLEngine(); } @@ -120,6 +140,13 @@ protected SSLEngine createEngine(IoSession session, InetSocketAddress addr) { } sslEngine.setUseClientMode(!session.isServer()); + + // Explicitly set the SNI extension so the server receives the correct hostname + if (sniHostName != null && !session.isServer()) { + SSLParameters sslParameters = sslEngine.getSSLParameters(); + sslParameters.setServerNames(Collections.singletonList(new SNIHostName(sniHostName))); + sslEngine.setSSLParameters(sslParameters); + } return sslEngine; } @@ -229,7 +256,7 @@ private void startAcceptor(SSLContext sslContext) throws Exception { acceptor.setReuseAddress(true); SslFilter sslFilter = new SslFilter(sslContext); - sslFilter.setEnabledProtocols(new String[] {"TLSv1.2"}); + sslFilter.setEnabledProtocols(enabledProtocol); DefaultIoFilterChainBuilder filters = acceptor.getFilterChain(); filters.addLast("ssl", sslFilter); @@ -271,7 +298,7 @@ public void onPreAdd(IoFilterChain parent, String name, NextFilter nextFilter) t }; sslFilter.setEndpointIdentificationAlgorithm("HTTPS"); - sslFilter.setEnabledProtocols(new String[] {"TLSv1.2"}); + sslFilter.setEnabledProtocols(enabledProtocol); DefaultIoFilterChainBuilder filters = connector.getFilterChain(); filters.addLast("ssl", sslFilter); @@ -310,7 +337,7 @@ private SSLContext createSSLContext(String keyStorePath, String trustStorePath) TrustManagerFactory tmf = TrustManagerFactory.getInstance(KEY_MANAGER_FACTORY_ALGORITHM); tmf.init(trustStore); - SSLContext ctx = SSLContext.getInstance("TLSv1.2"); + SSLContext ctx = SSLContext.getInstance(enabledProtocol); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); return ctx;