Problem mit Update von ApacheHttpClient von 5.2 auf 5.3

  • Themenstarter Gelöschtes Mitglied 68249
  • Beginndatum
G

Gelöschtes Mitglied 68249

Gast
Wahrscheinlich ist die Lösung total einfach und ich bin zu blöde um sie zu sehen.
Im ApacheHttpClient 5.3 ist NTCredentials deprecated. Diese funktionalität habe ich aber verwendet:
Java:
private HttpClientContext buildDefaultContext() {

    AuthScope authScope = new AuthScope((SSL ? "HTTPS" : "HTTP"), SERVER, PORT, null, null);
    BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();

    if(AUTH == Authorization.BASIC) {
        credsProvider.setCredentials(authScope, new UsernamePasswordCredentials(USERNAME, PASSWORD.toCharArray()));
    } else if(AUTH == Authorization.NT) {
        credsProvider.setCredentials(authScope, new NTCredentials(USERNAME, PASSWORD.toCharArray() ,null, REFSYSCONFIG.get("DOMAIN")));
    }

    HttpHost targetHost = new HttpHost((SSL ? "HTTPS" : "HTTP"), SERVER, PORT);
    AuthCache authCache = new BasicAuthCache();
    authCache.put(targetHost, new BasicScheme());

    HttpClientContext context = HttpClientContext.create();
    context.setCredentialsProvider(credsProvider);
    context.setAuthCache(authCache);
    return context;
}

In Zeile 9 baue ich für bestimmte Verbindungen einen credsProvider mit NTCredentials.
In den PatchNotes steht drin ich solle eben dafür auf Basic wechseln, aber irgendwie bin ich zu blöde das um zu setzen. Fakt ist, ohne Domäne schlägt die Anmeldung fehl.
Hatte auch schon sowas probiert:
Java:
credsProvider.setCredentials(authScope, new UsernamePasswordCredentials(USERNAME + "@" + DOMAIN, PASSWORD.toCharArray()));
ging aber leider auch nicht.
 

KonradN

Super-Moderator
Mitarbeiter
Also die üblichen beiden Wege, die Domain beim User mit zu geben sind:
user@domain
domain\user

Ersteres hast Du bereits versucht, das zweite wäre noch denkbar und bestimmt einen Versuch wert.
 
G

Gelöschtes Mitglied 68249

Gast
Schade, Antwort ist 401 Unauthorized.

Mir fällt einfach nicht ein, wie ich das anders machen kann.
 

Oneixee5

Top Contributor
ohne Domäne schlägt die Anmeldung fehl
Ja das ist richtig. Die wird benötigt, kann man aber auslesen - bei uns zumindest.
"HTTP" + Authorization.BASIC würde ich nicht tun, eher eine Exception werfen. Authorization.BASIC ist nicht sicher. Selbst die NTCredentials sollte man nicht per "HTTP" verwenden.
Java:
String UserDomainName = System.getenv("USERDOMAIN");
 
G

Gelöschtes Mitglied 68249

Gast
Die Antwort verwirrt mich. Wir haben so gut wie keine HTTP-Verbindungen mehr. In Produktion definitiv keine mehr und in den PreProd Systemen könnten auch schon alle umgestellt sein.
Die Domain bekomme ich als Parameter aus der Config, weil es nicht zwingend meine gerade verwendete Domain sein muss.
Löst aber nicht mein Problem:
Der Server hätte gerne eine Domain bei der Anmeldung und Apache schmeißt die NTCredentials aus der Version 5.3 raus. Ich bin kein Freund davon jetzt noch nicht nach einer Lösung zu suchen und wenn die 5.2 dann voller Sicherheitslücken ist, da zu stehen und unter Druck eine Lösung zu brauchen.
 
G

Gelöschtes Mitglied 68249

Gast
@Oneixee5: HTTP wäre noch möglich

Ich habe jetzt die Zeile folgendermaßen angepasst:
Java:
} else if(AUTH == Authorization.NT) {
    // credsProvider.setCredentials(authScope, new NTCredentials(USERNAME, PASSWORD.toCharArray() ,null, config.getDomain()));
    credsProvider.setCredentials(authScope, new UsernamePasswordCredentials(config.getDomain().toUpperCase() + "/" + USERNAME, PASSWORD.toCharArray()));
}
Den Rest habe ich nicht geändert.

Leider komme ich trotzdem auf einen 401.

Muss evtl. das AuthScope noch angepasst werden?
 
G

Gelöschtes Mitglied 68249

Gast
Den hatte ich tatsächlich auch gefunden, aber wenn ich das richtig verstehe "reaktiviert" er nur die alten Funktionen, die sind aber deprecated und somit potentiell in einer der nächsten Versionen raus. Außerdem teste ich das Ganze ja aktuell in der 5.2, und wenn es da schon nicht auf andrem Wege funktioniert, dann später in der 5.3 leider auch nicht.
 

Oneixee5

Top Contributor
Ich habe mich mal etwas schlau gemacht: NTCredentials ist nicht das Problem, nur die Reaktion... NTLM ist von $MS abgekündigt und wird zukünftig nicht mehr unterstützt. Ob überall in Windows weiß ich nicht, es gab wohl für das AD, Mailserver und Proxy eine Info an unseren Betrieb. NTLM gilt als nicht sicher. Du müsstest dich also in die Richtung Kerberos orientieren. Ich verwende da schon seit Jahren Waffle - damit hat man den wenigsten Ärger. In wieweit das ApacheHttpClient unterstützt weiß ich nicht. Das ist mir sowieso zu umständlich, ich nehme da lieber etwas mit höherem Abstraktions-Level.
Ich muss da auch mal ein paar Projekte nach NTLM durchschauen. Die werden immer nur selten gebraucht und sind runter gefahren. Irgend ein Admin fährt die dann für irgendwelche Wahlen hoch und dann geht der Ärger los. Patchen - immer auf den letzten Drücker. Es sind ja bald Europawahlen - da hätte ich schon mal etwas Vorsprung ...
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 68249

Gast
Hi, muss das Thema wieder aufwärmen, weil ich noch immer keine Lösung habe.
Also ich hatte die Tage mal Lust meine Verwendung des Apache HTTP Client gegen die Nativen NET-Sachen von Java zu tauschen. Ich dachte mir weniger Overhead == mehr Performance.

Grundsätzlich funktioniert alles mit wirklich wenig Code, aber es hapert mal wieder an der NT Authentifizierung, da bleibt der 401 stehen. Ich habe mal SPNEGO und WAFFLE grob überflogen, das ließt sich in beiden Fällen, als wenn das eine Sache für eine Serveranwendung wäre. Ich habe aber zusätzlich ein paar kleine Standalone-Anwendungen, die einfach über den Scheduler geladen werden, also keine Session, kein angemeldeter Domänenbenutzer, nur die JVM und die Zugangsdaten aus der Config.
Ich finde außerdem für keins der Systeme mal ein How to get started um es Step by Step für mich zu probieren. Oder ich suche falsch.

Achso, der Code sieht mittlerweile so aus:
Java:
    public HttpClientIntegration(Authorization authType, RestConfigInterface config) {
        String username = config.getUser();
        String password = config.getPassword();

        this.authType = authType;

        if (authType == Authorization.BASIC) {
            this.httpClient = HttpClient.newBuilder()
                    .authenticator(new Authenticator() {
                        @Override
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(username, password.toCharArray());
                        }
                    })
                    .build();
            this.authValue = null;
        } else if (authType == Authorization.HEADER) {
            this.httpClient = HttpClient.newHttpClient();
            this.authValue = username; // Token is passed as username
        } else if (authType == Authorization.NT) {
            String domain = config.getDomain();
            this.httpClient = HttpClient.newBuilder()
                    .authenticator(new Authenticator() {
                        @Override
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(domain.toUpperCase() + "/" + username, password.toCharArray());
                        }
                    })
                    .build();
            this.authValue = null;
        } else {
            this.httpClient = HttpClient.newHttpClient();
            this.authValue = null;
        }
    }
 

Oneixee5

Top Contributor
Du machst im Prinzip das Gleiche wie bei Basic, nur das du die Domain davor setzt. So funktioniert das nicht. NTLM macht schon etwas mehr.
NTLMDie NT LAN Manager (NTLM)-Authentifizierung ist ein Abfrage/Rückmeldungsschema, das eine Variante der Digestauthentifizierung mit höherer Sicherheit darstellt. NTLM verwendet die Windows-Anmeldeinformationen, um die Abfragedaten anstelle des unverschlüsselten Benutzernamens und Kennworts zu transformieren. Die NTLM-Authentifizierung erfordert mehrere Austausche zwischen dem Client und dem Server. Der Server sowie dazwischen liegende Proxys müssen beständige Verbindungen unterstützen, um die Authentifizierung erfolgreich abzuschließen.
 
G

Gelöschtes Mitglied 68249

Gast
Gut, ich hatte gehofft, dass sie mehr macht, als nur zwei Variablen zu verketten. Allerdings waren das ja die Ansätze aller anderen.
Heute morgen hatte ich mich bestimmt eine Stunde mit dem Code vom ApacheHttpClient beschäftigt und auch da drin ist nicht viel mehr zu finden, außer dass er bei getPrincipal domain\username zurück gibt.
Also bin ich davon ausgegangen, dass beim Aufbau der Verbindung bzw. beim Negotiaten unterschiedliche Dinge passieren. Aber ich hatte gehofft, da der ApacheHttpClient an der Stelle grundsätzlich auch nicht mehr hat, als einfache Strings, dass man diese irgendwie nachbauen kann.

Aber von dir kam doch z.B. die WAFFLE-Bibliothek ins Spiel. Kann man damit evtl. etwas machen? Oder vielleicht ist mein Teller wieder zu klein: wenn Microsoft NTLM nicht sicher genug findet, was soll denn dann zukünftig die Alternative sein?
 

Oneixee5

Top Contributor
Naja, dein Ziel ist etwas unverständlich. Du hast geschrieben, das du den Login nicht nur auf Servern einsetzen willst. Verwendest aber Apache HTTP Client - was kann man damit anderes ansprechen als Server?
Wenn du Waffle am Server einsetzt und der Browser der Client auf einer Windows Maschine, dann musst du Client seitig nur den Fall programmieren, das der Login abgelehnt wurde. Der Rest funktioniert out of the box.
Wenn du wirklich einen Java-Client erstellen willst, dann kannst du dir mal das hier anschauen: https://github.com/qumu/kerberos-client, oder es gibt da auch Tutorials. Oft sind die aber nicht so richtig komplett. Such am besten bei Microsoft.
wenn Microsoft NTLM nicht sicher genug findet, was soll denn dann zukünftig die Alternative sein?
Kerberos

Aber wie ich oben schon geschrieben habe:
Das ist mir sowieso zu umständlich, ich nehme da lieber etwas mit höherem Abstraktions-Level.
Es ist mir wichtiger, dass etwas fertig wird, als das ich alles selbst programmiere. Mit etwas unfertigem kann ich nichts verdienen. Notfalls muss man so eine Sache mal kaufen.

Ein privates Projekt, dass länger als ein oder zwei Monate dauert wird sowieso nie fertig. Man hat dann keine Lust mehr und die Basis ist dann schon veraltet. Es gibt dann keinen Lerneffekt mehr und wer will dann schon bei Github veröffentlichen und sagen: Sieh mal hier, ich hab was neues gebaut, dass auf einer veralteten Technologie basiert!
Geschäftlich ist das anders, da hat man mehr Ressourcen und Manpower. Da ist es schon mal möglich eine Rückstand aufzuholen und technische Schulden abzubauen.
 
G

Gelöschtes Mitglied 68249

Gast
Naja, dein Ziel ist etwas unverständlich
Das wisst ihr doch mittlerweile, dass ich irgendwie nie richtig erklären kann, was ich eigentlich will. Also im aktuellen Fall:
Ich habe ein einzelnes Java-Programm, das per Rest-Calls andere Programme fernsteuern soll. Da ich nicht für jedes andere Programm den Aufruf neu schreiben möchte habe ich eine Zentrale Klasse gebaut, die den reinen Aufruf und dessen Antwort übernehmen soll. Mir ist in dem Fall nur wichtig, was der ReturnCode war und was in der Antwort steht.
Da ApacheHttpClient keine Unterstützung mehr für NTLM anbietet und ich Kerberos auch nirgends in den Details finden konnte habe ich versucht mit der Abstraktion nach unten zu gehen. Aber, wie schon bemerkt, bringt das nichts, weil genauso schlecht.
Bei Kerberos dachte ich immer, da muss vorher ganz viel eingerichtet werden und da müssen DLLs und solche Dinge zur Verfügung gestellt werden.
Aber den Link, den du da angehangen hast, da sieht der Aufwand recht überschaubar aus. Das ist auch der Apache HTTPClient, allerdings sehe ich nicht, welche Version da verwendet worden ist, dafür kenne ich mich nicht genug mit Spring und Gradle aus.
Was für Bezahl-Lösungen gibt es denn für das Problem?
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zed JSF h:inputText h:outputText update Problem Allgemeines EE 2
G Problem mit redundanten Servern Allgemeines EE 7
Azemaria JSF: Problem bei der einfachsten Applikation Allgemeines EE 2
P JPA Internal Problem Nullpointer Allgemeines EE 10
S MessageDrivenBean Problem beim Zugriff auf Stateful EJB Allgemeines EE 2
M Glassfish Deployment-Problem unter Eclipse Allgemeines EE 0
B Problem beim Lesen des Codes... Allgemeines EE 2
R JPA Problem beim Speichern eines Users Allgemeines EE 2
S WebSocket Problem Allgemeines EE 0
F Eclipse/Java EE Debug-Problem Allgemeines EE 1
G Problem: Servlet in JSP einbinden mit <jsp:include> Allgemeines EE 3
Raidri [SEAM] rich:dataTable sortBy Problem Allgemeines EE 6
T Problem mit den Beispielen von Apache Allgemeines EE 5
W JSF Validator Problem HTTP Status 500 Allgemeines EE 2
E JBoss 7.1 Datasource Problem Allgemeines EE 2
M JSP Problem -unbestimmte Anzahl von Werten Transportieren Allgemeines EE 9
S Problem mit EJB Verständnis Allgemeines EE 4
B Problem beim einbinden einer CSS in eine JSP Allgemeines EE 8
F JSP Problem mit Datenbankanbindung über Glassfishserver Allgemeines EE 4
S java Entities Problem Allgemeines EE 19
S Embedded JBoss Problem beim Deployment Allgemeines EE 4
E Session Problem Allgemeines EE 9
F problem mit nullpointer bei DB zugriff Allgemeines EE 2
A Erste Schritte... Problem mit Hibernate Allgemeines EE 15
ruutaiokwu jboss problem - work-verzeichnis muss manuell gelöscht werden??? Allgemeines EE 5
Stillmatic sendRedirect Problem! Allgemeines EE 3
M Problem mit Lookup auf EJB3 mit Glassfish Allgemeines EE 11
0 Problem mit librarys javax.servlet.http.HttpServletRequest cannot be resolved Allgemeines EE 1
X JBoss InitialContext problem Allgemeines EE 5
LordZed Problem mit dem einbinden von Bibliotheken, die sich gegenseitig verwenden Allgemeines EE 5
H GWT Problem beim Ausführen Allgemeines EE 8
Q Problem mit JMS und Weblogic 10 Allgemeines EE 5
E Performance-Problem beim ersten Request Allgemeines EE 4
G Multi User Problem Allgemeines EE 8
G Datasource Problem Allgemeines EE 1
J OOP Java Array Problem Allgemeines EE 2
T Problem mit Java Transaction API Allgemeines EE 2
D Problem mit EJB: Bean soll Objekt eigener Klasse zurückgeben Allgemeines EE 2
N JavaMail Problem Allgemeines EE 4
N JBoss Problem mit Bibliothek in unterschiedlichen Versionen Allgemeines EE 2
A Tomcat -- JSP: komisches Problem Allgemeines EE 11
W Speicher-Problem bei WebApp unter Tomcat, Struts, Hibernate Allgemeines EE 3
B Problem mit ActionListener Allgemeines EE 13
G Simples JSF-Projekt in Eclipse - Problem Allgemeines EE 9
O eclipse - tomcat: Problem bei einfachem Webservice Allgemeines EE 16
J Problem mit EJB Aufruf und DualCore Rechner Allgemeines EE 4
J ejb3.0 datenbank problem Allgemeines EE 2
J Problem mit Zurück-Button Allgemeines EE 2
T Tomcat: JNDI + JDBC Problem Allgemeines EE 3
J problem mit jsp/js Allgemeines EE 2
B Help - EJB2 - Problem mit Hybernate und "LIMIT" Allgemeines EE 6
B JSTL Problem Allgemeines EE 8
byte Tomcat Deployment Problem (HTTP Status 503) Allgemeines EE 8
S Problem mit t:selectOneRadio und ValueChangeListener Allgemeines EE 2
S Problem mit Struts und tiles Allgemeines EE 4
B Problem mit JBoss-4.2.1.GA Allgemeines EE 8
N Tiles - JSF Problem Allgemeines EE 3
M JSF & EJB "Bean not bound" Problem Allgemeines EE 4
V MYSQL JDBC;java.lang.ClassNotFoundException; Problem Eclipse Allgemeines EE 3
megachucky JMS - Problem mit TemporaryQueue Allgemeines EE 2
G Problem mit MimeType/ContentType Allgemeines EE 4
E Java Mail problem Allgemeines EE 5
Y XFire - Maven Build Problem Allgemeines EE 2
D JSP Problem mit equals? Allgemeines EE 2
A Eclipse Start-Problem Allgemeines EE 5
S JSF - Custom converter Problem Allgemeines EE 3
Y JSF Uhrzeitausgabe Problem Allgemeines EE 4
M servlet --> jsp - problem beim umstrukturieren Allgemeines EE 5
Y JSF - rendered Problem Allgemeines EE 1
D Servlet Problem über Server Allgemeines EE 26
K mysql treiber problem wenn import java.sql.* bei _servlet_ Allgemeines EE 2
S JDBC Mysql Connection Problem - datasource null Allgemeines EE 3
T Session-Problem Allgemeines EE 2
R Tiles - Layout-Problem wegen Leerzeichen Allgemeines EE 6
G Tomcat / Eclipse oder Web.xml Problem Allgemeines EE 11
S Netbeans 5.5 Visual Web Pack Problem mit INSERT und PK Allgemeines EE 4
D JSF Problem mit Action Allgemeines EE 2
F Klassen und zugriffs Problem "Help wanted"! Allgemeines EE 16
D <input type="file"> Problem Allgemeines EE 6
N Struts - Problem mit <html:link> Action Allgemeines EE 3
A Problem / Fehler beim Einbinden einer Klasse in ein JSP Allgemeines EE 20
G Session Problem Allgemeines EE 5
T Ant Compiler Problem Allgemeines EE 9
T Problem dem Zaehler in mein Java - Code Allgemeines EE 2
A Hibernate-Problem mit MySQL-Cluster Allgemeines EE 6
H Servlet problem Allgemeines EE 10
G Problem mit Benutzerverwaltung Allgemeines EE 3
S Hibernate Mapping Problem Allgemeines EE 3
S Hibernate INSERT Problem Allgemeines EE 11
S Dummes JSP-Problem Allgemeines EE 8
P EJB-Installations-Problem Allgemeines EE 4
S CSS Problem in JSP Allgemeines EE 16
C Problem mit html:optionsCollection Allgemeines EE 4
R HILFE: Problem mit JSF examples Allgemeines EE 10
R Problem mit value-expression Allgemeines EE 7
R Problem mit for-schleife in JSP tag Allgemeines EE 8
B Struts Problem: Array in JSP ausgeben (logic:iterate) Allgemeines EE 12
M Redirct-Problem Allgemeines EE 4
M Geronimo v1.1 - Problem mit EAR deployen Allgemeines EE 5
S Problem mit Servlet Allgemeines EE 11

Ähnliche Java Themen


Oben