Estoy tratando de autenticación con kerberos/HTTP host. El uso de Apache HttpClient como mi cliente y una versión ligeramente modificada de esta fuente.
Mi autenticación Kerberos va perfectamente bien, y me gustaría saber cómo configurar las credenciales de inicio de sesión a través de programación. Por el momento, las credenciales se introducen manualmente a través de la consola, pero lo quiero tener elegido por mí en tiempo de ejecución. [ Como yo desee automatizar y prueba de carga en el servidor con un gran número de usuarios, en realidad. ].

EDIT : Aquí está un fragmento de código de las partes pertinentes :

La interfaz Credentials tiene dos métodos – getPassword() y getUserPrincipal(), pero a partir de depuración hice, no parecen ser invocada en todo.

Lo que me estoy perdiendo aquí ? ¿Qué es un limpiador de manera estática establecer las credenciales ?

Una muy cuestión similar se había preguntado antes, pero keytabs/inicio de sesión.conf hack es demasiado engorroso y no una opción práctica para un sistema automatizado de prueba de carga con un gran número de credenciales de usuario.
Agradecemos cualquier ayuda en este.

En C se haría uso de la rutina, la rutina c krb5_get_init_creds_password. No podía encontrar un análogo directo en Java kerberos api en los pocos minutos que miré web.mit.edu/kerberos/krb5-devel/doc/appdev/refs/api/…
C no es realmente una opción para mí. Debido a que el caso de prueba implica no solo kerberos, pero HTTP demasiado. La prueba se verifica basado en HTTP éxito redirigir los códigos de estado, etc. Pero si hay utilidades existentes (C/de la línea de comandos) que hace Kerberos+HTTP, estará encantado de intentar que. Yo no soy consciente de ninguna.
Estoy razonablemente seguro de curl puede hacer eso. curl -V curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.3.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
Creo que hay una versión de java de kinit, por lo que la api debe existir en algún lugar. No soy mucho de java experto. Tal vez esta pregunta puede ayudar a stackoverflow.com/questions/1037009/…
bien, sí. Voy a dar curl de un intento. Aunque no es una respuesta directa a la pregunta, que podría ayudar a resolver mi problema real! 🙂 Gracias por los punteros.

OriginalEl autor user30622 | 2014-02-07

1 Comentario

  1. 21

    Porque de SPNEGO el fragmento de código que has puesto (Credenciales clase de cosas de instalación) no es utilizado por httpclient para autenticar.

    Puede utilizar un DoAs + un CallBackhandler para pasar de usuario & contraseña en tiempo de ejecución.

    Entonces usted necesita una sesión.conf o cualquiera que sea el nombre con que esta dentro de:

    Puede cambiar el nombre de “KrbLogin” el nombre que quieras (recuerda usar el mismo nombre en código java)

    y establecer esta con java propiedades del sistema:

    o con un

    Entonces usted necesita un krb5 archivo de configuración (normalmente krb5.ini o krb5.conf con la configuración correcta en el interior)

    Si su estación de trabajo (o el servidor) está correctamente configurado para la autenticación Kerberos esta clase debería funciona como es (con propper archivo de inicio de sesión.conf y krb5.ini) he utilizado httpclient 4.3.3 y java 1.7 a probar:

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.auth.AuthSchemeProvider;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.Credentials;
    import org.apache.http.client.CredentialsProvider;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.config.AuthSchemes;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    import org.apache.http.impl.auth.SPNegoSchemeFactory;
    import org.apache.http.impl.client.BasicCredentialsProvider;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import javax.security.auth.Subject;
    import javax.security.auth.callback.*;
    import javax.security.auth.login.LoginContext;
    import javax.security.auth.login.LoginException;
    import java.io.IOException;
    import java.security.AccessController;
    import java.security.Principal;
    import java.security.PrivilegedAction;
    import java.util.Set;
    public class HttpClientKerberosDoAS {
    public static void main(String[] args) throws Exception {
    System.setProperty("java.security.auth.login.config", "login.conf");
    System.setProperty("java.security.krb5.conf", "krb5.conf");
    System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
    String user = "";
    String password = "";
    String url = "";
    if (args.length == 3) {
    user = args[0];
    password = args[1];
    url = args[2];
    HttpClientKerberosDoAS kcd = new HttpClientKerberosDoAS();
    System.out.println("Loggin in with user [" + user + "] password [" + password + "] ");
    kcd.test(user, password, url);
    } else {
    System.out.println("run with User Password URL");
    }
    }
    public void test(String user, String password, final String url) {
    try {
    LoginContext loginCOntext = new LoginContext("KrbLogin", new KerberosCallBackHandler(user, password));
    loginCOntext.login();
    PrivilegedAction sendAction = new PrivilegedAction() {
    @Override
    public Object run() {
    try {
    Subject current = Subject.getSubject(AccessController.getContext());
    System.out.println("----------------------------------------");
    Set<Principal> principals = current.getPrincipals();
    for (Principal next : principals) {
    System.out.println("DOAS Principal: " + next.getName());
    }
    System.out.println("----------------------------------------");
    call(url);
    } catch (IOException e) {
    e.printStackTrace();
    }
    return true;
    }
    };
    Subject.doAs(loginCOntext.getSubject(), sendAction);
    } catch (LoginException le) {
    le.printStackTrace();
    }
    }
    private void call(String url) throws IOException {
    HttpClient httpclient = getHttpClient();
    try {
    HttpUriRequest request = new HttpGet(url);
    HttpResponse response = httpclient.execute(request);
    HttpEntity entity = response.getEntity();
    System.out.println("----------------------------------------");
    System.out.println("STATUS >> " + response.getStatusLine());
    if (entity != null) {
    System.out.println("RESULT >> " + EntityUtils.toString(entity));
    }
    System.out.println("----------------------------------------");
    EntityUtils.consume(entity);
    } finally {
    httpclient.getConnectionManager().shutdown();
    }
    }
    private  HttpClient getHttpClient() {
    Credentials use_jaas_creds = new Credentials() {
    public String getPassword() {
    return null;
    }
    public Principal getUserPrincipal() {
    return null;
    }
    };
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(new AuthScope(null, -1, null), use_jaas_creds);
    Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create().register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory(true)).build();
    CloseableHttpClient httpclient = HttpClients.custom().setDefaultAuthSchemeRegistry(authSchemeRegistry).setDefaultCredentialsProvider(credsProvider).build();
    return httpclient;
    }
    class KerberosCallBackHandler implements CallbackHandler {
    private final String user;
    private final String password;
    public KerberosCallBackHandler(String user, String password) {
    this.user = user;
    this.password = password;
    }
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
    for (Callback callback : callbacks) {
    if (callback instanceof NameCallback) {
    NameCallback nc = (NameCallback) callback;
    nc.setName(user);
    } else if (callback instanceof PasswordCallback) {
    PasswordCallback pc = (PasswordCallback) callback;
    pc.setPassword(password.toCharArray());
    } else {
    throw new UnsupportedCallbackException(callback, "Unknown Callback");
    }
    }
    }
    }
    }

    Nota:

    puede utilizar:

    System.setProperty("sun.security.krb5.debug", "true");

    o:

    -Dsun.security.krb5.debug=true

    para investigar los problemas.

    Gracias. Nunca tuve oportunidad de probarlo. Y me di cuenta de otra manera con curl, etc. mientras tanto.
    Funciona perfectamente, gracias! Para aquellos que utilizan la llanura de java URLConnection, establecer el valor predeterminado autenticador podría ser más fácil – consulte docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/…
    Si estás en Windows, puede que necesite configurar una entrada del registro. Este artículo me ayudará a conseguir este trabajo cr.openjdk.java.net/~weijun/especiales/krb5winguide-2/raw_files/… y también documenta el inicio de sesión.conf un poco así. También puede utilizar KerberosCredentials en lugar de implementar ‘Credenciales’ como en la origional la pregunta anterior, es un poco más ordenado.

    OriginalEl autor eljeko

Dejar respuesta

Please enter your comment!
Please enter your name here