SSLSocketFactory в Java, сетевое подключение LDAP

Мой вопрос похож на: SSLSocketFactory в java

Мне нужно установить собственный SSLSocketFactory... за исключением того, что у меня НЕ есть https-соединение (это LDAPS), поэтому я не могу использовать:

HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

... чтобы установить SSLSocketFactory. У меня инициализирован объект SSLContext, но когда я устанавливаю соединение LDAP, SSLContext по умолчанию вызывается автоматически, поскольку мой пользовательский объект не установлен:

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

Существует ли эквивалентный метод, отличный от HTTPS, для строки № 3 ниже:

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

  2. sc.init(myKeyManagerFactory.getKeyManagers(), myTrustManagerArray, новый java.security.SecureRandom());

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


person Kenny Cason    schedule 06.03.2020    source источник


Ответы (1)


Да, есть.

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

Незащищенный SSLSocketFactory.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();
    }
}
person Eng.Fouad    schedule 06.03.2020
comment
Что, если моя фабрика сокетов — это не класс, а объект, возвращаемый функцией sc.getSocketFactory()? - person Kenny Cason; 06.03.2020
comment
AFAIK, это не поддерживается. Это должен быть класс, доступный в пути к классам, и реализация LDAP загрузит его. - person Eng.Fouad; 06.03.2020