java - logo - hbase client download
Cliente Kerberos simple en Java? (9)
Aplicaciones como Google Chrome e IE pueden manejar de forma transparente la autenticación Kerberos; sin embargo, no puedo encontrar una solución Java "simple" que coincida con esta transparencia. Todas las soluciones que he encontrado requieren la presencia de un archivo krb5.conf y un archivo login.conf que parecen necesitar más de las aplicaciones anteriores.
¿Cuál es la mejor manera de crear una aplicación Java con capacidades SSO de Kerberos que simplemente funcionan?
[actualización]: para que quede claro, necesito una solución lateral CLIENTE para crear tickets que no los validen. Además, parece que SPNEGO es el protocolo "envoltorio" predeterminado que eventualmente delegará a Kerberos pero también necesito poder manejar el protocolo SPNEGO.
Añadiendo a David Roussels la respuesta en la autenticación kerberos http específica de url: -
La razón por la cual su código funciona es porque su SPN de destino (principal del lado del servidor) está configurado con HTTP / [email protected]. En ese caso, funcionará porque no está configurando explícitamente el token. URLConnection internamente establece un token con ese SPN
1 Realice los pasos (de mi respuesta anterior) para obtener un tema
2 Use el contexto de gss api init sec para generar un token de contexto. Hay numerosos tutoriales disponibles para este paso
3 Base 64 codifican el token
4 Adjunte el token a urlconnection: -
URL url = new URL("http://myhost/myapp")
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); =
urlConn.setRequestProperty("Authorization", "Negotiate " + encodedToken);
5 Implementar una acción privilegiada: -
//this internally calls the getInputStream
public class PrivilegedGetInputStream implements PrivilegedExceptionAction<InputStream>
6 Envuelve todo en Subject.doAs
//use prev answer instructions to get subject
Subject.doAs(subject, new PrivilegedGetInputStream(urlConnection)
Ahora hay una solución simple para esto usando Apache HTTP Components Client 4.5 o superior. Esto todavía se marca como experimental en 4.5, por lo que su kilometraje puede variar, pero esto está funcionando bien para mí en un contexto empresarial.
Además de los tarros de cliente HC 4.5, deberá tener los tarros httpclient-win, jna y jna-platform en su classpath, tal como se proporciona con http-component-client. A continuación, construye un cliente HC habilitado para Kerberos de la siguiente manera:
CloseableHttpClient httpclient = WinHttpClients.createDefault();
O usando el constructor:
HttpClientBuilder clientBuilder = WinHttpClients.custom();
Que luego se puede personalizar según sea necesario antes de construir el cliente:
CloseableHttpClient client = clientBuilder.build();
Esta solución funciona sin ninguna configuración externa y, lo que es más importante, resuelve el problema por el que el mecanismo JRE incorporado se rompe para los usuarios con derechos de administrador local en Windows 7+. Esto es posible porque el ticket Kerberos se recupera directamente de la API SSPI a través de JNA, en lugar de pasar por el GSSAPI provisto por JRE.
Código de ejemplo del equipo de componentes de http
Todo esto fue posible gracias al buen trabajo de Daniel Doubrovkine, Timothy Wall y Ryan McKinley.
Aquí hay una buena publicación de blog sobre tener un cliente Java para usar con Kerberos http://sachithdhanushka.blogspot.com/2014/02/kerberos-java-client-configuration.html
Creé una pequeña herramienta para simplificar la conexión con httpclient a kerberos, es posible que desee intentarlo. https://github.com/DovAmir/httpclientAuthHelper
DefaultHttpClient httpclient = new DefaultHttpClient();
AuthUtils.securityLogging(SecurityLogType.KERBEROS,true);
CredentialsUtils.setKerberosCredentials(client, new UsernamePasswordCredentials("xxx", "xxx"), "domain", "kdc");
client.executeMethod(httpget);
En realidad no necesitas hacer nada. En Java 6, en una máquina cliente de Windows puede hacer esto:
new URL("http://myhost/myapp").openStream();
Y negociar autenticación solo funciona. Por lo menos lo hace por mí. Y el servidor que probé solo admite Negotiate, no NTLM auth.
Ok, si quieres evitar el uso de un archivo login.conf, necesitas codificar de manera diferente:
//define your own configuration
import javax.security.auth.login.Configuration;
public class CustomLoginConfiguration extends Configuration
//pass certain parameters to its constructor
//define an config entry
import javax.security.auth.login.AppConfigurationEntry;
private AppConfigurationEntry configEntry;
//define a map of params you wish to pass and fill them up
//the map contains entries similar to one you have in login.conf
Map<String, String> params = new HashMap<String, String>();
//define the configuration
configEntry = new AppConfigurationEntry(
"com.sun.security.auth.module.Krb5LoginModule",
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, params);
//implement getappconfig method
public AppConfigurationEntry[] getAppConfigurationEntry() {
return new AppConfigurationEntry[] { configEntry };
}
Ahora, una vez que haya terminado con esta definición, puede usar esto en su uso para obtener tickets de kdc
//get ticket in login context
LoginContext lc = null;
lc = new LoginContext("lc", null, callback, new CustomLoginConfiguration(argumentlist));
lc.login();
Ahora, de aquí en adelante, puedes obtener el tema jaas y básicamente puedes hacer un montón de cosas de autenticación.
En caso de que necesite más indicaciones, simplemente deje un comentario.
Oracle tiene un ejemplo que usa el SaslClient de Java . No soy un programador de Java, pero cuando lo señalé una vez a alguien que sí lo hizo, pudieron hacerlo funcionar rápidamente. Todavía puede requerir un archivo "conf" en alguna parte (nb Kerberos usa variables de entorno, a menudo comenzando con KRB5_, para saber dónde buscar dichos archivos). También tenga en cuenta que Kerberos no incluye ningún tipo de transporte: su aplicación necesita saber cómo enviar y recibir las cargas de Kerberos de la forma esperada por el servidor (y esto es diferente según el servidor con el que intenta autenticarse).
Editar: editó su pregunta, así que aquí hay un enlace relacionado con SPNEGO en Java que podría ser de alguna utilidad: http://download.oracle.com/javase/6/docs/technotes/guides/security/jgss/lab/part5.html
Puede usar las propiedades del sistema en lugar de los archivos de configuración para especificar el nombre de host KDC y el nombre del servicio, pero esas cosas (al menos) son obligatorias ....
Waffle en realidad le dará la información que necesita para establecer la mayoría de las propiedades, incluso si no le ofrece un boleto. Mire la clase WindowsAuthProviderImpl (el archivo de ayuda de Waffle.chm muestra la API).
Yo uso JAAS, obtengo un ticket de servicio de Active Directory en dos pasos:
Use Krb5LoginModule para recuperar el TGT en caché y agréguelo al Sujeto.
Utilice el Asunto y GSS-API para recuperar un ticket de servicio del KDC.
Hay una gran cantidad de buena información y código de ejemplo en The Java Way of Active Directory .
Usa WAFFLE