Http Header, Http Proxy

Patrick123

Mitglied
Hallo zusammen,

ich würde gerne mit Hilfe der Library "Apache Http Client" auf eine URL zugreifen, die eine JSON-Datei anzeigt und diese auslesen. Es ist ein Http-Proxy und eine Basic Authentication mittels Http-Header notwendig. Als Header muss Authorization Basic „username : password Base64 encodiert“ gesetzt sein.
Leider bin ich nun nach ettlichen Versuchen an einem Punkt angekommen, an dem ich einfach nicht mehr weiß was ich noch anderst machen kann...
Hier einer meiner Versuche:
Java:
public static void main(String[] args) throws Exception {

        // ************PROXY************
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(new AuthScope("xx-proxy-xxxx.xxxx.com", 8080),
                new UsernamePasswordCredentials("de\\xxxxx", "xxxxxxxxx"));
        credsProvider.setCredentials(new AuthScope("https://xxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxx", 8080),
                new UsernamePasswordCredentials("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                        "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"));
        CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();
        try {
            HttpHost target = new HttpHost("xxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxx", 8080, "https");
            HttpHost proxy = new HttpHost("xx-proxy-xxxx.xxxx.com", 8080);

            RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
            HttpGet httpget = new HttpGet("https://xxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxx");
            httpget.setConfig(config);

            System.out.println("Executing request " + httpget.getRequestLine() + " to " + target + " via " + proxy);

            CloseableHttpResponse response = httpclient.execute(target, httpget);
            try {
                System.out.println("----------------------------------------");
                System.out.println(response.getStatusLine());
                System.out.println(EntityUtils.toString(response.getEntity()));
            } finally {
                response.close();
            }
        } finally {
            httpclient.close();
        }
        // ************BASIC AUthentication************
        try {
            String webPage = "https://xxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxx";
            String name = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            String password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

            String authString = name + ":" + password;
            System.out.println("auth string: " + authString);
            byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
            String authStringEnc = new String(authEncBytes);
            System.out.println("Base64 encoded auth string: " + authStringEnc);

            URL url = new URL(webPage);
            URLConnection urlConnection = url.openConnection();
            urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
            InputStream is = urlConnection.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);

            int numCharsRead;
            char[] charArray = new char[1024];
            StringBuffer sb = new StringBuffer();
            while ((numCharsRead = isr.read(charArray)) > 0) {
                sb.append(charArray, 0, numCharsRead);
            }
            String result = sb.toString();

            System.out.println("*** BEGIN ***");
            System.out.println(result);
            System.out.println("*** END ***");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
       
        // ************ABFRAGE************
        HttpGet httpGet = new HttpGet("https://xxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxx");
        CloseableHttpResponse response1 = httpclient.execute(httpGet);
        try {
            System.out.println(response1.getStatusLine());
            HttpEntity entity1 = response1.getEntity();
            EntityUtils.consume(entity1);
        } finally {
            response1.close();
        }
    }

Würde mich über Anregungen, Tipps oder vielleicht sogar Beispiele sehr freuen!

MfG
 
Das ist die Ausgabe der Konsole:
Code:
Executing request GET https://xxxxxxxxxxxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxxxxxxxxx HTTP/1.1 to https://xxxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxxx:8080 via http://xx-proxy-xxxx.xxxxx.com:8080
----------------------------------------
HTTP/1.1 400 Bad Request
<HTML><HEAD>
<TITLE>Request Error</TITLE>
</HEAD>
<BODY>
<img src="http://www.intranet.xxxxx.com/app/review/ctu/images/xxxxxx.gif" width="126" height="28">
<FONT face="Helvetica">
</FONT>
<blockquote>
<TABLE border=0 cellPadding=1 width="80%">
<TR><TD>
<FONT face="Helvetica">
<big>Request Error (invalid_request)</big>
<BR>
<BR>
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica">
Your request could not be processed. Request could not be handled
<BR>
<BR>
Detailed technical information:<BR><BR>
URL: <BR>
Category(ies): <BR><BR>
Proxy: si0psg01<BR>
Client Adress: 10.8.0.183<BR>
Time: [26/10/2017:09:34:54 GMT]<BR>
User: \<BR>
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica">
This could be caused by a misconfiguration, or possibly a malformed request.
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica" SIZE=2>
<BR>
For assistance, contact CI-Hotline at 3311 <br>&nbsp;&nbsp;&nbsp;<u>SMT Information</u>: Product Name & Initiator Script =>  <i>Internet Web Access</i> .
</FONT>
</TD></TR>
</TABLE>
</blockquote>
</FONT>
</BODY></HTML>

auth string: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Base64 encoded auth string: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
java.net.UnknownHostException: xxxxxxxxx.com
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
    at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at ClientProxyAuthentication.main(ClientProxyAuthentication.java:78)
Exception in thread "main" java.lang.IllegalStateException: Connection pool shut down
    at org.apache.http.util.Asserts.check(Asserts.java:34)
    at org.apache.http.pool.AbstractConnPool.lease(AbstractConnPool.java:189)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.requestConnection(PoolingHttpClientConnectionManager.java:257)
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:176)
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
    at ClientProxyAuthentication.main(ClientProxyAuthentication.java:100)

Leider verstehe ich nicht wirklich, was mir diese Ausgabe sagen will. Auch die "UnknownHostException" hilft mir nicht auf die Sprünge.
 
Ich habe keine Ahnung was du da alles machst aber warum versuchst du es nicht einfach mal so:

Code:
       try {
           URL url = new URL ("http://ip:port/");
           String encoding = Base64.getEncoder().encodeToString(("test1:test1").getBytes(‌"UTF‌-8"));

           HttpURLConnection connection = (HttpURLConnection) url.openConnection();
           connection.setRequestMethod("POST");
           connection.setDoOutput(true);
           connection.setRequestProperty  ("Authorization", "Basic " + encoding);
           InputStream content = (InputStream)connection.getInputStream();
           BufferedReader in   =
               new BufferedReader (new InputStreamReader (content));
           String line;
           while ((line = in.readLine()) != null) {
               System.out.println(line);
           }
       } catch(Exception e) {
           e.printStackTrace();
       }
 
Du baust das viel zu kompliziert auf. Stelle die paar Felder halt selbst zusammen. Desweiteren: Ja, Unknown Host bedeutet, die festgelegte Adresse kann nicht aufgelöst werden.

Desweiteren: Alles im Quelltext per Hand durch x ersetzen kann schnell dazu führen das man 'etwas' vergisst. Mit 'Etwas' sind hier sensible Informationen gemeint, die besser nicht im Internet seien.
 
Wenn ich das im Browser eingebe muss ich mich erstmal über ein "Anmeldefenster" das aufpoppt authentifizieren. Nachdem ich das gemacht habe sehe ich den Inhalt einer JSON Datei.
Das soll eigentlich nur die Anmeldung am Proxy sein, ja. Da ich aber viel rumprobiert habe, ist da auch noch ein Versuch der Basis Authentifizierung mit dabei...
 
Hast du wirklich genau den link auch genommen den du im source benutzt hast? Glaube ich nämlich nicht. Du hast bestimmt irgendwo etwas anders
 
Ist irgendwie erkennbar ob das
Code:
HTTP/1.1 400 Bad Request
vom Proxy oder von deinem Zielrechner kommt ?
 
Ich habe sowohl im Code, als auch beim Testen im Browser, die gleiche URL verwendet.

In dem Fall ist das glaube ich leider nicht erkennbar - zumindest für mich nicht...
 
Patrick123 wieso hörst du nicht auf meinen Rat?
Java:
    private static byte[] httpAuthAndProxyTest() throws IOException {
        ByteBuffer byteBuffer = ByteBuffer.allocate(1000 * 1000);

        URL url = new URL("https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx");
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("202.129.41.91", 8081));
        URLConnection openConnection = url.openConnection(proxy);
        openConnection.addRequestProperty("Authorization", "Basic aHR0cHdhdGNoOmZmZg==");
        try (InputStream inputStream = openConnection.getInputStream()) {
            int read;
            while ((read = inputStream.read()) != -1) {
                byteBuffer.put((byte) read);
            }
        }

        byte[] b = new byte[byteBuffer.position()];
        byteBuffer.rewind();
        byteBuffer.get(b);
        return b;
    }

Das liefert dir den 'Inhalt' als Byte Array vorher umgeleitet über en Proxy...

Das wird in dem Fall über Thailand geschickt (solange der Proxy noch gültigkeit hat...).
1234321.gif
(Das mit 'byteBuffer' ist nicht ganz so toll).

Bearbeitung: Diese authentication wird hier erläutert:
https://www.httpwatch.com/httpgallery/authentication/
 
Zuletzt bearbeitet von einem Moderator:
@JStein52: Ich habe mal die Anmeldedaten am Proxy geändert. Es kommt die gleiche Fehlermeldung.
@DerWissende: Ich habe mal den Code mit meinen Daten getestet. Es erscheint folgende Fehlermeldung:
Code:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: https://xxxxxxxxxxxxxxxxxxxxx.com/api/v1/exemplar/serialnumber?identnumber=xxxxxxxxxxxxxxxxxxx
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at tests.httpAuthAndProxyTest(tests.java:23)
    at tests.main(tests.java:11)
 
Wenn ich die URL im Browser eingebe und diese auch funktioniert, sprich nach erfolgreicher Authentifizierung bekomme ich den Inhalt einer JSON angezeigt, aber nicht den scheinbar "richtigen" Proxy im Browser eingetragen habe, dann benötige ich in meinem Programm ja auch nicht den scheinbar "richtigen" Proxy, oder?
 
Von einer Anmeldung am Proxy hast du im Vorfeld nüschst gesagt - oder ich habe es überlesen:
https://stackoverflow.com/questions/1626549/authenticated-http-proxy-with-java
Zweite Frage: Fällt die Anmeldung an der Internetseite weg dann?

401 Unauthorized Die Anfrage kann nicht ohne gültige Authentifizierung durchgeführt werden. Wie die Authentifizierung durchgeführt werden soll, wird im „WWW-Authenticate“-Header-Feld der Antwort übermittelt.
401 kann in dem Fall sowohl von der Internetseite stammen als auch vom Proxy. 😳

Dritte Frage: Was hast du in deinem Browser eingetippert? Also möchte ich jetzt NICHT den Benutzernamen und den Passwort wissen, sondern das was/wie.

Vierte Frage: Wenn du magst, nenn mir einfach die Bezeichnung/Adrre. des Proxys.
 

Zurück
Oben