¿Cómo especificar la versión SSL/TLS en la conexión LDAP de Java?
jndi (2)
Estoy trabajando en un LDAP-Client de Java y todavía me falta algo de información o conocimiento sobre cómo hacer esto correctamente.
Mi código se ve así:
LdapContext ctx = null;
Hashtable<String, String> env = new Hashtable <String, String>();
try{
env.clear();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "url");
env.put(Context.SECURITY_PRINCIPAL, "user");
env.put(Context.SECURITY_CREDENTIALS, "password");
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put("java.naming.security.ssl.ciphers", "SSL_RSA_EXPORT_WITH_RC4_40_MD5");
ctx = new InitialLdapContext(env, null);
} catch(NamingException nex) {
// error handling
}
Las siguientes cosas suceden en este momento:
- Al depurar la conexión SSL, veo que se está estableciendo una conexión TLSv1 entre mi servidor LDAP y mi programa.
- Veo lo siguiente para mi cliente y servidor en un apretón de manos SSL:
*** ClientHello, TLSv1.2
y*** ServerHello, TLSv1
Las cosas que me estoy perdiendo ahora mismo
- Agregué un cifrado para ser incluido, pero no lo veo en la lista de cifrados admitidos que se ofrecen en el mensaje de saludo de mi cliente
- No especifiqué que mi cliente ofrezca TLS1.2 en su mensaje de bienvenida, ¿de dónde viene ese ajuste?
- Me gustaría poder determinar si quiero usar TLS o SSL y qué versión de TLS o SSL se va a utilizar, ¿cómo puedo lograrlo? (Así que puedo, por ejemplo, solo permitir TLS 1.1 y 1.2)
¿Qué versión de Java usas? Parece que el servidor ldap no es compatible con TLSv1.2, debe especificar la fábrica de socket ssl dedicada para el servicio ldap.
env.put("java.naming.ldap.factory.socket", CustomTLSSSLSocketFactory.class.getName);
CustomTLSSSLSocketFactory extends SSSLSocketFactory {
public CustomTLSSSLSocketFactory() {
TrustManagerFactory factory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
factory.init((KeyStore) null);
TrustManager[] defaultTrustManagers = factory.getTrustManagers();
// create the real socket factory
SSLContext sc = SSLContext.getInstance("TLS"); //$NON-NLS-1$
sc.init(null, defaultTrustManagers, null);
delegate = sc.getSocketFactory();
}
}
Primero escanee su servidor antes de perder el tiempo buscando cosas que probablemente no funcionen. uso: https://github.com/rbsec/sslscan
Es posible que su servidor sea compatible solo con TLS 1.0.