Los mecanismos de autentificaci�n Simple y CRAM-MD5 autentifican el cliente LDAP con el servidor LDAP. No proporcionan otras caracter�sticas de seguridad, como asegurar que las solicitudes que se env�an al servidor sobre la conexi�n autentificada son del mismo cliente o proteger la privacidad de los datos intercambiados entre el cliente y el servidor.
Para proporcionar mayores niveles de seguridad para la comunicaci�n con los clientes, la mayor�a de los servidores LDAP permiten acceder a sus servicios a trav�s de SSL. Dichos servidores soportan puertos SSL adem�s de los puertos normales (desprotegidos). Para usar este servicio, el cliente necesita especificar el n�mero de puerto de un puerto SSL en la propiedad Context.PROVIDER_URL y usar sockets SSL cuando se comunique con el servidor.
Por defecto, el proveedor de servicio LDAP de Sun usa sockets planos cuando se comunica con un servidor LDAP. Para solicitar que se usen sockets SSL, configuramos la propiedad Context.SECURITY_PROTOCOL a "ssl".
En el siguiente ejemplo, el servidor LDAP, ofrece SSL en el puerto 636. Para ejecutar este programa debemos activar SSL en el puerto 636 de nuestro servidor LDAP. Este procedimiento normalmente lo lleva a cabo el administrador de directorios.
// Set up the environment for creating the initial context
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:636/o=JNDITutorial");
// Specify SSL
env.put(Context.SECURITY_PROTOCOL, "ssl");
// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");
// Create the initial context
DirContext ctx = new InitialDirContext(env);
// ... do something useful with ctx
Para ejecutar este programa, necesitamos tener un paquete SSL que implemente el interface javax.net.SocketFactory (para m�s detalles puedes ver http://java.sun.com/security/ssl/API_users_guide.html). El paquete SSL debe etar disponible en nuestro entorno de ejecuci�n (como el navegador HotJava o Java Web Server) o a�adi�ndolo a nuestro CLASSPATH. Actualmente, Sun tambi�n proporciona una implementaci�n SSL solitaria, Java Secure Socket Extension.
|
Nota:
Si usamos SSL para conectarnos a un servidor sobre un puerto que no est� usando SSL, nuestro programa se colgar�. De forma similar, si usamos un socket normal para conectar a un socket SSL del servidor, el programa tambi�n se colgar�. Esto es una caracter�stica del protocolo SSL. |
�Usar SSL con el Mecanismo External de SASL
SSL proprociona autentificaci�n y otros servicios de seguirdad en una capa inferior al LDAP. Como la autentificaci�n ya se ha realizado, la capa LDAP peude usar la informaci�n de autentificaci�n sobre SSL usando el mecanismo SASL External.
El siguiente ejemplo es como el ejemplo anterior, excepto en que vez de usar una autentificaci�n simpple, usa una autentificaci�n SASL External. Usando External, no necesitamos suministrar ninguna informaci�n sobre el nombre o la password, porque se obtienen desde el SSL.
// Set up the environment for creating the initial context
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
// Principal and credentials will be obtained from the connection
env.put(Context.SECURITY_AUTHENTICATION, "EXTERNAL");
// Specify SSL
env.put(Context.SECURITY_PROTOCOL, "ssl");
// Create the initial context
DirContext ctx = new InitialDirContext(env);
...
�Usar Sockets Personalizados
Cuando configuramos la propiedad Context.SECURITY_PROTOCOL a "ssl", el proveedor LDAP usa la factor�a de sockets javax.net.ssl.SSLSocketFactory para intentar crear un socket SSL para comunicar con el servidor. Para usar un paquete SSL diferente, necesitamos configurar la propiedad "java.naming.ldap.factory.socket" con el nombre de la clase de la factor�a de sockets que produce sockets SSL. Esta clase debe implementar el interface javax.net.SocketFactory. (Puedes ver m�s detalles en http://java.sun.com/security/ssl/API_users_guide.html).
Los sockets SSL son s�lo uno de los tipos de sockets. Podr�amos pensar en otro tipo de sockets que podr�an ser �tiles, como aquellos para saltarse los firewalls. Podemos usar la propiedad de entorno "java.naming.ldap.factory.socket" para especificar el uso de otros tipos de sockets. Esto es �til para seleccionar la factor�a de sockets para una conexi�n b�sica. Para seleccionar todos los sockets usados en el programa, usamos java.net.Socket.setSocketFactory(). Observa que si Context.SECURITY_PROTOCOL se configura a "ssl", entones la propiedad "java.naming.ldap.factory.socket" deber�a especificar una factor�a de sockets que produzca sockets SSL.
Aqu� hay un ejemplo que crea un contexto inicial usando una factor�a de sockets personalizados:
// Set up the environment for creating the initial context
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:555/o=JNDITutorial");
// Specify the socket factory
env.put("java.naming.ldap.factory.socket", "com.widget.socket.MySocketFactory");
// Create the initial context
DirContext ctx = new InitialDirContext(env);
// ... do something useful with ctx
�Paquetes Java SSL
Otros APIs Java, como RMI, usan SSL. La documentaci�n RMI incluye una lista de problemas relacionados con RMI-SSL, incluyendo los paquetes Java SSL disponibles dentro y fuera de los Estados Unidos. Para m�s detalles puedes ver http://java.sun.com/products/jdk/1.2/docs/guide/rmi/SSLInfo.html.