HTTP/1.1 401 Authorization Required with HttpClient 4.1.1

廉价感情. 提交于 2019-12-06 12:34:29

问题


Updated Code:- Using SSL, still am getting the same error..

I am trying to open this uri

https://some-host/a/getmeta?id=10  (this url is passed to proxi.jsp page)

And this is my proxi.jsp page, And I am getting this error HTTP/1.1 401 Authorization Required and when I am passing my credentials too. Why is it happening so.. And that site use siteminder.

    <%@ page language="java" import="
org.apache.http.HttpEntity,
org.apache.http.HttpResponse,
org.apache.http.auth.AuthScope,
org.apache.http.auth.UsernamePasswordCredentials,
org.apache.http.client.methods.HttpPost,
org.apache.http.client.methods.HttpGet,
org.apache.http.impl.client.DefaultHttpClient,
org.apache.http.util.EntityUtils,
java.io.InputStream,
java.io.InputStreamReader,
java.io.BufferedReader,
java.security.KeyStore,
java.io.FileInputStream,
java.io.File,
org.apache.http.conn.ssl.SSLSocketFactory,
org.apache.http.conn.scheme.Scheme,
javax.net.ssl.HostnameVerifier,
org.apache.http.impl.conn.SingleClientConnManager,
javax.net.ssl.HttpsURLConnection,
org.apache.http.conn.scheme.SchemeRegistry,
javax.net.ssl.SSLContext,
java.security.cert.X509Certificate,
javax.net.ssl.X509TrustManager,
javax.net.ssl.TrustManager,
org.apache.http.conn.ClientConnectionManager,
java.security.cert.CertificateException,
org.apache.http.conn.scheme.Scheme"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>

    <%
    String a_Url = request.getParameter( "url" ) ;

    DefaultHttpClient httpclient = new DefaultHttpClient();
    try {
        httpclient.getCredentialsProvider().setCredentials(
                new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, "realm"),
                new UsernamePasswordCredentials("test", "pass"));


        KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
        //FileInputStream instream = new FileInputStream(new File("my.keystore"));
        InputStream instream = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.keystore");
        try {
            trustStore.load(instream, "nopassword".toCharArray());
        } finally {
            try { instream.close(); } catch (Exception ignore) {}
        }
    /* 
        SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
        Scheme sch = new Scheme("https", 443, socketFactory);
        httpclient.getConnectionManager().getSchemeRegistry().register(sch);
        */



        SSLContext ctx = SSLContext.getInstance("TLS");
        X509TrustManager tm = new X509TrustManager() {

        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }

        public X509Certificate[] getAcceptedIssuers() {
        return null;
        }
        };
        ctx.init(null, new TrustManager[]{tm}, null);
        SSLSocketFactory ssf = new SSLSocketFactory(ctx);
        ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        ClientConnectionManager ccm = httpclient.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme("https", ssf, 443));




        HttpGet httpget = new HttpGet(a_Url);



        System.out.println("executing request" + httpget.getRequestLine());
        HttpResponse res = httpclient.execute(httpget);

        HttpEntity entity = res.getEntity();

        System.out.println("----------------------------------------");
        System.out.println(res.getStatusLine());
        if (entity != null) {

            System.out.println("Response content length: " + entity.getContentLength());
            InputStream input = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String ln = "";
            while((ln = reader.readLine()) != null) {
                out.println("During Get - " + ln);
            }
            entity.consumeContent();
        }
        EntityUtils.consume(entity);
    }

    catch (Throwable t) {
        StackTraceElement[] x = t.getStackTrace();
        for(int k=0;k<x.length;k++) {
            out.println(x[k].toString());
        }
        //out.println();
        t.printStackTrace();
    }


    finally {
        // When HttpClient instance is no longer needed,
        // shut down the connection manager to ensure
        // immediate deallocation of all system resources
        httpclient.getConnectionManager().shutdown();
    }


    %>

回答1:


You are accessing a secure site but I don't see any SSL handling in your HttpClient code. Can you have a look at this page and try out in a standalone client after filling in the appropriate gaps?




回答2:


First of all from the code you posted it does not seem that you are configuring http client to use HTTPS.
You are missing code like the following (at least for org.apache.http.client.HttpClient):

SSLSocketFactory sf = new SSLSocketFactory(sslcontext); 
Scheme https = new Scheme("https", sf, 443);
httpclient.getConnectionManager().getSchemeRegistry().register(https);  

You have to check out a tutorial for DefaultHttpClient
In any case to see what's going on, you can use a sniffing tool like wireshark.
The SSL handshake is viewable and you will be able to see the connection failure and understand why.




回答3:


Unless you know for sure that "realm" is the proper value in that AuthScope constructor, I'd recommend removing it or determine what the actual value should be.




回答4:


change the following line: new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, "realm")

to the following line:

new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM)


来源:https://stackoverflow.com/questions/6551774/http-1-1-401-authorization-required-with-httpclient-4-1-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!