javaldapsslsocketfactorysslcontext

SSLSocketFactory in Java, LDAP network connection


My question is similar to: SSLSocketFactory in java

I need to set a custom SSLSocketFactory...except I do NOT have an https connection (it's LDAPS), so can't use:

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

...to set the SSLSocketFactory. I have an SSLContext object initialized but when I make the LDAP connection the default SSLContext is called automatically since my custom one is not set:

dirContext = new InitialDirContext(env); // <-- reverts to default ssl context

Is there a non-HTTPS equivalent method to line #3 below:

  1. SSLContext sc = SSLContext.getInstance("SSL");

  2. sc.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerArray, new java.security.SecureRandom());

  3. HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());


Solution

  • Yes, there is.

    env.put("java.naming.ldap.factory.socket", UnsecuredSSLSocketFactory.class.getName());
    

    UnsecuredSSLSocketFactory.java:

    public class UnsecuredSSLSocketFactory extends SSLSocketFactory
    {
        private SSLSocketFactory socketFactory;
    
        public UnsecuredSSLSocketFactory()
        {
            try
            {
                var sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, new TrustManager[]{new X509TrustManager()
                {
                    @Override
                    public void checkClientTrusted(X509Certificate[] xcs, String string){}
    
                    @Override
                    public void checkServerTrusted(X509Certificate[] xcs, String string){}
    
                    @Override
                    public X509Certificate[] getAcceptedIssuers()
                    {
                        return null;
                    }
                }}, new SecureRandom());
                socketFactory = sslContext.getSocketFactory();
            }
            catch(Exception e)
            {
                throw new RuntimeException(e);
            }
        }
    
        @SuppressWarnings("unused")
        public static SocketFactory getDefault()
        {
            return new UnsecuredSSLSocketFactory();
        }
    
        @Override
        public String[] getDefaultCipherSuites()
        {
            return socketFactory.getDefaultCipherSuites();
        }
    
        @Override
        public String[] getSupportedCipherSuites()
        {
            return socketFactory.getSupportedCipherSuites();
        }
    
        @Override
        public Socket createSocket(Socket socket, String string, int i, boolean bln) throws IOException
        {
            return socketFactory.createSocket(socket, string, i, bln);
        }
    
        @Override
        public Socket createSocket(String string, int i) throws IOException
        {
            return socketFactory.createSocket(string, i);
        }
    
        @Override
        public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException
        {
            return socketFactory.createSocket(string, i, ia, i1);
        }
    
        @Override
        public Socket createSocket(InetAddress ia, int i) throws IOException
        {
            return socketFactory.createSocket(ia, i);
        }
    
        @Override
        public Socket createSocket(InetAddress ia, int i, InetAddress ia1, int i1) throws IOException
        {
            return socketFactory.createSocket(ia, i, ia1, i1);
        }
    
        @Override
        public Socket createSocket() throws IOException
        {
            return socketFactory.createSocket();
        }
    }