changeset 804:361441253305 monetdbs

Send SNI (Server Name Indication)
author Joeri van Ruth <joeri.van.ruth@monetdbsolutions.com>
date Mon, 11 Dec 2023 15:04:59 +0100 (16 months ago)
parents 1671f2eb130b
children 2fee4b71baac
files src/main/java/org/monetdb/mcl/net/SecureSocket.java tests/TLSTester.java
diffstat 2 files changed, 14 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/monetdb/mcl/net/SecureSocket.java
+++ b/src/main/java/org/monetdb/mcl/net/SecureSocket.java
@@ -8,6 +8,8 @@ import java.security.*;
 import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
+import java.util.Collections;
+import java.util.List;
 
 public class SecureSocket {
     private static final String[] ENABLED_PROTOCOLS = {"TLSv1.3"};
@@ -16,32 +18,29 @@ public class SecureSocket {
     public static Socket wrap(Target.Validated validated, Socket inner) throws IOException {
         Target.Verify verify = validated.connectVerify();
         SSLSocketFactory socketFactory;
+        boolean checkName = true;
         try {
             switch (verify) {
                 case System:
                     socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
-                    return wrapSocket(inner, validated, socketFactory, true);
+                    break;
                 case Cert:
-                        KeyStore keyStore = keyStoreForCert(validated.getCert());
-                        socketFactory = certBasedSocketFactory(keyStore);
-                    return wrapSocket(inner, validated, socketFactory, true);
+                    KeyStore keyStore = keyStoreForCert(validated.getCert());
+                    socketFactory = certBasedSocketFactory(keyStore);
+                    break;
                 case Hash:
-                    return wrapHash(validated, inner);
+                    socketFactory = hashBasedSocketFactory(validated.connectCertHashDigits());
+                    checkName = false;
+                    break;
                 default:
                     throw new RuntimeException("unreachable: unexpected verification strategy " + verify.name());
             }
+            return wrapSocket(inner, validated, socketFactory, checkName);
         } catch (CertificateException e) {
             throw new SSLException(e.getMessage(), e);
         }
     }
 
-    private static Socket wrapHash(Target.Validated validated, Socket inner) throws IOException, CertificateException {
-        SSLSocketFactory socketFactory = hashBasedSocketFactory(validated.connectCertHashDigits());
-        SSLSocket sock = wrapSocket(inner, validated, socketFactory, false);
-
-        return sock;
-    }
-
     private static SSLSocket wrapSocket(Socket inner, Target.Validated validated, SSLSocketFactory socketFactory, boolean checkName) throws IOException {
         SSLSocket sock = (SSLSocket) socketFactory.createSocket(inner, validated.connectTcp(), validated.connectPort(), true);
 
@@ -50,6 +49,8 @@ public class SecureSocket {
 
         if (checkName) {
             SSLParameters parameters = sock.getSSLParameters();
+            SNIServerName serverName = new SNIHostName(validated.connectTcp());
+            parameters.setServerNames(Collections.singletonList(serverName));
             parameters.setEndpointIdentificationAlgorithm("HTTPS");
             sock.setSSLParameters(parameters);
         }
--- a/tests/TLSTester.java
+++ b/tests/TLSTester.java
@@ -132,7 +132,7 @@ public class TLSTester {
 //        test_connect_client_auth2();
         test_fail_tls_to_plain();
         test_fail_plain_to_tls();
-//        test_connect_server_name();
+        test_connect_server_name();
 //        test_connect_alpn_mapi9();
         test_connect_trusted();
         test_refuse_trusted_wrong_host();