Necesito conectarme a un directorio LDAP sobre SSL.cómo aceptar certificados autofirmados para conexiones JNDI/LDAP?
En entornos no productivos, utilizamos los certificados de firma propia que, por supuesto, no puede validar con:
javax.naming.CommunicationException: simple bind failed: ldapserver:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]
at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:197)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2694)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.init(InitialContext.java:223)
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134)
soy consciente de cómo utilizar un custom trust manager for SSL-enabled connections, pero no sabemos cómo use uno en conexión con la API JNDI donde no administro la conexión real. Es decir, ¿dónde está la siguiente configuración estándar para poder conectar el administrador de confianza?
Gracias de antemano.
Hashtable env = new Hashtable();
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");
LdapContext ctx = new InitialLdapContext(env, null);
ctx.search (...)
Gracias. Creo que es lo correcto; Tengo algunas dificultades para ejecutarlo dentro de JBoss, sospecho que los diferentes cargadores de clases causan una "java.lang.IllegalArgumentException: el objeto no es una instancia de declaración de clase" cuando el socket se instancia a través de la reflexión en com.sun.jndi.ldap.Connection.createSocket (Connection.java:317) pero ese es un problema diferente – wishihadabettername
Solo para ayudar a alguien a encontrarse con la IllegalArugumentException; necesita implementar el método estático getDefault() en su SocketFactory personalizado (SSL). –