# Apache HttpClient über Proxy mit Authentifizierung auf externe Website zugreifen



## tommey (23. August 2011)

Hey, ich hab ein programm welches vie Apache HttpClient und POST/GET auf externe Webseiten zugreift und Inhalte ausliest. Das funktioniert soweit ganz gut. Sitze ich aberan  einem Rechner der über ein Proxy ins Internet geht, funktioniert das ganze natürlich nicht mehr. Auf der Suche wie man dem Apache HttpClient die proxyEinstellungen zuweist bin ich nur auf das hier gestoßen:

```
HttpClient client = new HttpClient();
client.getHostConfiguration().setProxy("proxy.net", 8080);
```

Der spezielle proxy über den ich ins Internet gehe will aber ne Authentifizierung haben, weiß jemand wie man das macht?


----------



## Fabio Hellmann (23. August 2011)

Hi,
hast du es schon mal über den System-Proxy probiert?


```
System.setProperty("proxySet","true");
System.setProperty("http.proxyHost","proxy");
System.setProperty("http.proxyPort","8080");
System.setProperty("http.proxyUser", "benutzer");
System.setProperty("http.proxyPassword", "passwort");
```

Gruß

Fabio


----------



## tommey (23. August 2011)

Nein das klappt nicht, die Exception lautet jedes Mal:


```
23.08.2011 09:17:19 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect
23.08.2011 09:17:19 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
23.08.2011 09:17:20 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect
23.08.2011 09:17:20 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
23.08.2011 09:17:21 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: Connection refused: connect
23.08.2011 09:17:21 org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.<init>(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl.createSocket(Unknown Source)
	at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:82)
	at org.apache.commons.httpclient.protocol.SSLProtocolSocketFactory.createSocket(SSLProtocolSocketFactory.java:127)
	at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
	at sec.Updater.login(Updater.java:35)
	at sec.LogInThread.run(LogInThread.java:22)
	at java.lang.Thread.run(Unknown Source)
```

Und mein Quellcode


```
public class Updater {

	private static HttpClient client = new HttpClient();
	private static String url = "https://neSeite.de/";
	private static ArrayList<Exam> ergebnisListe = new ArrayList<Exam>();

	public static boolean login(String username, String password) {

		try {
			/*
			System.setProperty("proxySet","true");
			System.setProperty("http.proxyHost","debasvap005.ad.norddrive.net");
			System.setProperty("http.proxyPort","8080");
			System.setProperty("http.proxyUser", "usernamename");
			System.setProperty("http.proxyPassword", "pw");			
			//client.getHostConfiguration().setProxy("debasvap005.ad.norddrive.net", 8080);
			*/

			
			
			client.getParams().setCookiePolicy(
					CookiePolicy.BROWSER_COMPATIBILITY);

			// GET für Cookie setzen
			GetMethod getMethod = new GetMethod(url);
			client.executeMethod(getMethod);
			org.apache.commons.httpclient.Cookie[] cookies = client.getState()
					.getCookies();

			// Cookie setzen
			HttpState initialState = new HttpState();
			initialState.addCookie(cookies[0]);
			client.setState(initialState);

			// POST für Login
			PostMethod postMethod = new PostMethod(url + "login.do");
			postMethod.addParameter("username", username);
			postMethod.addParameter("password", password);
			client.executeMethod(postMethod);

			String response = postMethod.getResponseBodyAsString();
			if (!response.contains("Ihre Daten")) {
				return false;
			}

		} catch (Exception e) {
			
			e.printStackTrace();
			return false;
		}
		return true;
	}
```

Also ich denke dass es am proxy liegt, weil zu Hause funktioniert alles.
Ich weiß auch nicht, ob er bei http.proxyHost lieber die IP will?!


----------



## SE (23. August 2011)

Mal ne Frage : steht dieser Server bei euch im LAN und ist euer Zugang zum Internet ?
Wenn ja : auf jeden Fall die LAN-interne IP nutzen !
Ich selber kann zu diesem Server noch nicht einmal eine IP rausbekommen *kein DNS-Record* was warscheinlich der Grund sein dürfte *wobei bei euch im LAN diese Domain natürlich durch einen LAN-DNS auf den Proxy geleitet werden kann*.

btw :
1) nutze bitte JAVA-Tags *siehe Signatur* wenn es um Java-Code geht ... das erhöt die Lesbarkeit
2) auch wenn man diesen Proxy von außen nicht erreichen kann so sollten Zugangsdaten *Username , Passwort , andere IDs* nicht öffentlich preisgegeben werden -> solltest du dringen ändern.


----------



## tommey (23. August 2011)

Jo das stimmt mit dem Server. Ich hab nur das Problem, dass ich LAN interne IP nicht weiß. über netstat könnte ich raten, weil ich mich damit nicht so besonders auskenne. Weißt du wie man die rausbekommt? Über IE steht leider nur die adresse des servers.


----------



## SE (23. August 2011)

Naja ... da gibt es einen schönen Trick : PING
Egal ob Windows oder Linux ... PING ist ein Systemtool was sich auf ALLEN Systemen findet. In aller regel kann man ping sowohl Domain-Namen als auch IPs übergeben und bekommt in der Regel schon in der ersten Zeile die aufgelöste IP angezeigt.

Alternativ kannst du das auch mit TRACERT / TRACEROUT machen ... dauert länger aber listet dir das gesamte Netz-Schema bis zum Ziel auf.


----------



## tommey (23. August 2011)

Super danke, die IP + Port hab ich. Nun weiter 

Ich habs jetzt probiert über:

```
client.getHostConfiguration().setProxy("dieIPdesProxys", 8080);
			Credentials defaultcreds = new UsernamePasswordCredentials("meinusername", "meinPW");
			client.getState().setProxyCredentials(AuthScope.ANY, defaultcreds);
			client.getParams().setAuthenticationPreemptive(true);
```

Damit bekomme ich 


```
23.08.2011 13:45:11 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
WARNUNG: Required credentials not available for BASIC <any realm>@stisys.informatik.haw-hamburg.de:443
23.08.2011 13:45:11 org.apache.commons.httpclient.HttpMethodDirector authenticateHost
WARNUNG: Preemptive authentication requested but no default credentials available
```

Langsam wird mir das zu hoch...BASIC steht doch für die Authentifizierungsart oder? Wenn ja kann man die doch bestimmt ändern. Kann man denn Authentifizierungsart beim Proxy erfragen?
Sorry für die vielen Fragen, ich suche schon den ganzen Vormittag nach einer Lösung aber konnte nichts brauchbares bis jetzt finden.


----------



## tommey (23. August 2011)

Ok ich glaube noch etwas rausgefunden zu haben. Die Seite auf die ich zugreifen will,
ist https://stisys.informatik.haw-hamburg.de/stisys/
Wenn ich mit Opera die Seite aufrufe, meldet mit Opera:
"Sicherheitsproblem: Die Zertifikatskette des Servers ist unvollständig und der oder die Aussteller sind nicht registriert. Annehmen?
Zertifikatsfehler: Das Zertifikat ... ist vom  unbekannten Zertifikataustseller ... unterzeichnet. Es kann nicht festgestellt werden, ob dies ein gültiges zertifikat ist."

Durch rumbastelei habe ich jetzt auch eine Verbindung über den Proxy in java hinbekommen, allerdings meldet der Proxy als Antwort HTTP/1.1 403 Forbidden. Kann das vielleicht mit der Seite und den Proxyeinstellungen zutun haben, dass ich darauf nicht zugreifen kann?


----------



## SE (23. August 2011)

Also mein IE9 erkennt das Zertifikat als gültig an.
Das HTTP403 kann wegen einem deaktiviertem Index-Listing kommen.


----------



## genodeftest (23. August 2011)

Ich nutze auch Opera, bei mir kommt aber keine Fehlermeldung wegen Zertifikaten. Auch kein Problem mit Chromium und Firefox.


----------

