2012-03-27 26 views
5

Piszę połączenie HTTP z uwierzytelnianiem Kerberos. Mam "HTTP/1.1 401 Nieautoryzowane". Czy możesz mi polecić co powinienem sprawdzić? Myślę, że jest jakaś sztuczka, ale nie widzę tego.Połączenie Kerberos za pomocą klienta HTTP

Może powinienem ustawić nagłówek "WWW-Authenticate" z "Negotiate"?

Bardzo dziękuję za pomoc i pomysły.

public class ClientKerberosAuthentication { 

    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("sun.security.krb5.debug", "true"); 
     System.setProperty("javax.security.auth.useSubjectCredsOnly","false"); 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     try { 
      NegotiateSchemeFactory nsf = new NegotiateSchemeFactory(); 
      httpclient.getAuthSchemes().register(AuthPolicy.SPNEGO, nsf);    

      List<String> authpref = new ArrayList<String>(); 
      authpref.add(AuthPolicy.BASIC); 
      authpref.add(AuthPolicy.SPNEGO); 
      httpclient.getParams().setParameter(AuthPNames.PROXY_AUTH_PREF, authpref);    


      httpclient.getCredentialsProvider().setCredentials(
        new AuthScope(null, -1, AuthScope.ANY_REALM, AuthPolicy.SPNEGO), 
        new UsernamePasswordCredentials("myuser", "mypass"));    

      System.out.println("----------------------------------------"); 
      HttpUriRequest request = new HttpGet("http://localhost:8084/web-app/webdav/213/_test.docx"); 
      HttpResponse response = httpclient.execute(request); 
      HttpEntity entity = response.getEntity(); 

      System.out.println("----------------------------------------"); 
      System.out.println(response.getStatusLine()); 
      System.out.println("----------------------------------------"); 
      if (entity != null) { 
       System.out.println(EntityUtils.toString(entity)); 
      } 
      System.out.println("----------------------------------------"); 

      // This ensures the connection gets released back to the manager 
      EntityUtils.consume(entity); 

     } finally { 
      httpclient.getConnectionManager().shutdown(); 
     } 
    } 
} 
+0

Napisałem alternatywne rozwiązanie dla tego problemu tutaj: http://stackoverflow.com/a/22865583/381161 –

Odpowiedz

0

Miałem ten sam problem i właśnie znalazłem twój post. Zrobiłem zakładkę, aby móc umieścić odpowiedź, gdy ją naprawię. Zamieszczam link do mojego pytania, na które ktoś odpowiedział, więc jeśli ktoś znajdzie to przez Google, znajdzie odpowiedź:

HttpClient ma problem z tworzeniem nazwy SPN dla AD, gdy URL ma port.

Zobacz moje pytanie + odpowiedź tutaj: HttpClient check Kerberos secured webpage. NTLM login didn't work

3

SPNEGO nie będą działać, ponieważ używasz localhost jako URL hosta.

Twój serwer jest skonfigurowany dla zestawu nazw SPN (lub co najmniej jednego) rozpoczynających się od HTTP/ zarejestrowanych na koncie usługi ActiveDirectory. Możesz zapytać ich o AD dzięki setspn -l yourServiceAccount.

Twój adres URL musi używać efektywnej nazwy hosta serwera, znanej jako SPN w ActiveDirectory, aby klient Apache Http mógł negocjować TGS dla tej usługi i wysłać ją do serwera.

0

Oto klient testowy, który napisałem w moim projekcie. Klient ten opiera się na wszystkie rodzaje szyfrowania być włączona JDK,

Jeśli widzisz idąc w dziennikach a keytab są szyfrowane w 256-bitowych domyślnych etypes dla default_tkt_enctypes: 17 16 23 1 3.

następnie po słoiku http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html musi być pobrane i umieszczone w JDK/jre/lib/security włączyć bitowe szyfrowanie AES256 po tym powinny być widoczne następujące dzienniki w domyślnych etypes dla default_tkt_enctypes: 18 17 16 23 1 3.

import java.io.IOException; 
import java.io.InputStream; 
import java.security.Principal; 
import java.security.PrivilegedAction; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.Set; 

import javax.security.auth.Subject; 
import javax.security.auth.kerberos.KerberosPrincipal; 
import javax.security.auth.login.AppConfigurationEntry; 
import javax.security.auth.login.Configuration; 
import javax.security.auth.login.LoginContext; 

import org.apache.commons.io.IOUtils; 
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.CookieStore; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.config.AuthSchemes; 
import org.apache.http.client.config.CookieSpecs; 
import org.apache.http.client.config.RequestConfig; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpUriRequest; 
import org.apache.http.config.Lookup; 
import org.apache.http.config.RegistryBuilder; 
import org.apache.http.impl.auth.SPNegoSchemeFactory; 
import org.apache.http.impl.client.BasicCookieStore; 
import org.apache.http.impl.client.BasicCredentialsProvider; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClientBuilder; 
import org.apache.http.impl.cookie.BasicClientCookie; 

klasie użytkowej

Powiązane problemy