Aplicaciones de Google Chrome y el IE puede manejar de forma transparente la autenticación Kerberos; sin embargo no puedo encontrar un «simple» solución de Java para que coincida con esta transparencia. Todas las soluciones que he encontrado, requieren de la presencia de un krb5.conf archivo y un inicio de sesión.conf archivo que abisal de las anteriores aplicaciones parecen requerir.

¿Cuál es la mejor manera de construir una aplicación Java con Kerberos SSO capacidades que sólo el trabajo?

[actualización]: para que quede claro necesito un CLIENTE solución del lado de la creación de entradas no la validación de los mismos. También, parece que SPNEGO es el valor predeterminado de «contenedor» de protocolo que eventualmente delegado de Kerberos, pero tengo que ser capaz de manejar la SPNEGO protocolo así.

InformationsquelleAutor Andrew White | 2011-04-27

9 Comentarios

  1. 8

    Oracle ha un ejemplo del uso de Java SaslClient. Yo no soy un programador de Java, pero cuando me señaló una vez a alguien que es, ellos fueron capaces de hacer que funcione con bastante rapidez. Es posible que todavía requieren de un «conf» el archivo en alguna parte (n.b. Kerberos utiliza variables de entorno, que a menudo comienza con KRB5_, para saber dónde buscar para este tipo de archivos). También tenga en cuenta que Kerberos mismo no incluyen el transporte de cualquier tipo, su aplicación necesita saber cómo enviar y recibir la Kerberos cargas de la forma en que el servidor espera (y esto es diferente dependiendo del servidor que está intentando autenticar con).

    Editar: edita tu pregunta, así que aquí está un enlace relacionado con SPNEGO en Java que puede ser de alguna utilidad:
    http://download.oracle.com/javase/6/docs/technotes/guides/security/jgss/lab/part5.html

  2. 13

    Ahora hay una solución simple para esto se utiliza la Apache HTTP Componentes de Cliente 4.5 o superior. Este está marcado como experimental en 4.5 por lo que su kilometraje puede variar, pero esto está funcionando bien para mí en una empresa de contexto.

    Además de la HC 4.5 cliente frascos usted necesitará tener el httpclient-ganar, jna y jna-plataforma de frascos en el classpath, como siempre con http-componente-cliente. Usted, a continuación, construir un Kerberos HC-cliente como sigue:

    CloseableHttpClient httpclient = WinHttpClients.createDefault();

    O utilizar el generador de:

    HttpClientBuilder clientBuilder = WinHttpClients.custom();

    Que luego pueden ser personalizados, como es requerido antes de la construcción del cliente:

    CloseableHttpClient client = clientBuilder.build();

    Esta solución funciona sin ningún tipo de configuración externo, y lo más importante es que resuelve el problema en el que en-construido JRE mecanismo de saltos para los usuarios con derechos de Administrador local en Windows 7+. Esto es posible porque el ticket de Kerberos que se obtiene directamente de la IPS de la API a través de la JNA, en lugar de ir a través de la GSSAPI proporcionados por el JRE.

    Ejemplo de código desde el http-componentes del equipo de

    Todo ello fue posible por el buen trabajo de Daniel Doubrovkine Timoteo Pared
    y Ryan McKinley

    • Está usted seguro de que esto funciona? Comprobé la 4.4-INSTANTÁNEA y construido e instalado de forma local (en mi repositorio de Maven) y trató de que el código de arriba, pero no pudo autenticar. Hay algo que falta en este ejemplo, o solo estoy haciendo algo mal?
    • Se está trabajando en mi entorno. ¿Qué va mal? Has activado la salida de depuración de HC? Está usted seguro de que tiene la correcta principio de servicio para el servicio que se desee autenticar?
    • Supongo que esta solución sólo funciona si su Windows/credenciales de Active Directory (nombre de usuario/contraseña) son el mismo que el nombre de usuario/contraseña para el servidor Kerberos. Tengo un escenario en el que no es el caso y el código anterior no funciona para mí. Es allí una manera de darle el correcto nombre de usuario/contraseña?
    • Dónde está marcada/documentado como «experimental»? Es que todavía es el caso, ¿sabes?
    • href=»https://github.com/apache/httpclient/blob/trunk/httpclient-win/src/main/java/org/apache/http/impl/auth/win/WindowsNegotiateScheme.java» >github.com/apache/httpclient/blob/trunk/httpclient-win/src/main/…
    • Gracias. WinHttpClients sí mismo (el punto de entrada AFAICT) no menciona eso.
    • Este requiere nombre de usuario/contraseña para poder usarlo? Que derrota el propósito de kerberos en mi situación, así que me pregunto. Quiero ser capaz de suministrar el archivo keytab y que me registro, o simplemente el uso de la actual sesión del usuario.
    • Ningún usuario/contraseña es necesaria, que es el punto! Adquiere un token de Kerberos desde el sistema operativo a través de JNA para la sesión actual del usuario.

  3. 9

    Agregar a David Roussels respuesta en la dirección url específica basada en http de autenticación de kerberos:-

    La razón por la que el código funciona es porque su objetivo SPN(lado del servidor principal) está configurado para con HTTP/[email protected] En ese caso va a trabajar porque no establecer explícitamente el token. URLConnection establece internamente un símbolo con el que SPN

    1 Realice los pasos de mi anterior respuesta) para obtener un objeto de

    2 Uso gss api init sec contexto para generar un token de contexto. Hay numerosos tutoriales que hay para este paso

    3 Base 64 codificar el token

    4 Fije el token de urlconnection:-

    URL url = new URL("http://myhost/myapp")
    HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); = 
    urlConn.setRequestProperty("Authorization", "Negotiate " + encodedToken);

    5 Implementar una privilegiada de acción:-

    //this internally calls the getInputStream
    public class PrivilegedGetInputStream implements PrivilegedExceptionAction<InputStream>

    6 Envolver toda la cosa en el Tema.doAs

    //use prev answer instructions to get subject
    Subject.doAs(subject, new PrivilegedGetInputStream(urlConnection)
  4. 7

    Usted realmente no necesita hacer nada. En Java 6, en un cliente de Windows de la máquina de hacer esto:

    new URL("http://myhost/myapp").openStream();

    Y negociar la autenticación funciona. Por lo menos no para mí. Y el servidor que he probado en sólo admite Negociar, no de la autenticación de NTLM.

    • ¿qué tiene esto que ver con la creación de Kerberos la factura?
    • La pregunta original era «¿Cuál es la mejor manera de construir una aplicación Java con Kerberos SSO capacidades que sólo el trabajo?». Y yo estaba señalando que Java 6 ¿SPNEGO authenication para usted en windows, así que usted no debe lidiar con krb5.conf. Kerberos es usado por debajo. Simplemente funciona, mucho mejor de lo que esperaba. Nota: esto significa que usted tiene que usar el valor predeterminado cliente HTTP, y no se puede utilizar apache commons http libs.
    • ahora entiendo lo que estás diciendo. Voy a tener que dar a este un intento en algún momento.
    • Creo que estoy siendo muy denso, pero la URL no parecen tener un getInputStream() método, ¿te refieres a openStream() (esto no funciona para mí, aunque en el mismo conjunto de describir.
    • ah, sí, me refería openStream(). Hizo instalar el JRE con el instalador, o simplemente descomprimirlo? Tal vez el instalador hace algo para que funcione.
  5. 4

    Aceptar si desea evitar el uso de un inicio de sesión.conf archivo, usted necesita código de forma 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 se puede utilizar esta en que el uso de este para obtener los boletos de kdc

    //get ticket in login context
    LoginContext lc = null;
        lc = new LoginContext("lc", null, callback, new CustomLoginConfiguration(argumentlist));
        lc.login();

    Ahora a partir de aquí, usted puede obtener jaas sujeto y, básicamente, se puede hacer un montón de autenticación cosas.

    En caso de que necesite más punteros simplemente dejar un comentario.

  6. 2

    Puede usar las propiedades del sistema en lugar de los archivos de configuración para especificar el KDC nombre de host y el nombre de servicio, pero esas cosas (al menos) son obligatorios….

    Waffle realmente le dará la información que necesita para configurar la mayoría de las propiedades, incluso si no va a obtener un boleto. Mira la WindowsAuthProviderImpl clase (el Waffle.chm archivo de ayuda se muestra la API).

    Yo uso JAAS hacer obtener un vale de servicio de Active Directory en dos pasos:

    1. Uso Krb5LoginModule para recuperar la caché TGT y agregarlo al Tema.

    2. Utilizar el Sujeto y el GSS-API para recuperar un servicio de venta de entradas a partir del KDC.

    Hay un montón de buena información y un código de ejemplo en El Java Manera de Active Directory.

  7. 1

    He creado una pequeña herramienta para simplificar la conexión con httpclient para kerberos, puede que desee darle una oportunidad.
    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);
    • Asumir que tengo en una aplicación cliente que se ejecuta en *nix, un Active Directory token, ahora necesito validar, y conseguir que el [email protected] y grupo de lista desde el token/servidor de ANUNCIOS. Es eso posible ?
  8. 0

    Uso WAFFLE

    • Que es para que el servidor del sitio, no un cliente.
    • Es compatible con un cliente así.
    • WAFFLE es solo para Windows…

Dejar respuesta

Please enter your comment!
Please enter your name here