how to accept self-signed certificates for JNDI/LDAP connections?

前端 未结 6 1560
死守一世寂寞
死守一世寂寞 2020-12-13 15:33

I need to connect to an LDAP directory over SSL.

In non-production environments, we use self-signed certificates which, of course, fails to validate with:

         


        
6条回答
  •  無奈伤痛
    2020-12-13 16:16

    You could accept any certificate when you override the Trustmanager:

    DummyTrustmanager.java

    public class DummyTrustmanager implements X509TrustManager {
        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
            // do nothing
        }
    
        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
            // do nothing
        }
    
        public X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[0];
        }
    }
    

    MySSLSocketFactory.java

    public class MySSLSocketFactory extends SSLSocketFactory {
        private SSLSocketFactory socketFactory;
    
        public MySSLSocketFactory() {
            try {
                SSLContext ctx = SSLContext.getInstance("TLS");
                ctx.init(null, new TrustManager[] { new DummyTrustmanager() }, new SecureRandom());
                socketFactory = ctx.getSocketFactory();
            } catch (Exception ex) {
                ex.printStackTrace(System.err);
                /* handle exception */
            }
        }
    
        public static SocketFactory getDefault() {
            return new MySSLSocketFactory();
        }
    
        @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, UnknownHostException {
            return socketFactory.createSocket(string, i);
        }
    
        @Override
        public Socket createSocket(String string, int i, InetAddress ia, int i1) throws IOException, UnknownHostException {
            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();
        }
    }
    

    Main.java

    public class Main {
        public static void main(String[] args) throws NamingException {
            Hashtable env = new Hashtable(11);
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldaps://ldapserver:636/");
            env.put(Context.SECURITY_PROTOCOL, "ssl");
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, "myUser");
            env.put(Context.SECURITY_CREDENTIALS, "myPassword");
            env.put("java.naming.ldap.factory.socket", "ldapsecure.MySSLSocketFactory");
            LdapContext ctx = new InitialLdapContext(env, null);
        }
    }
    

提交回复
热议问题