java - 使用 HTTP Commons Client 在服务器上进行身份验证

标签 java apache-commons-httpclient

我对此完全是初学者,并且我已经尝试与服务器建立连接很长一段时间了

public class Test {

    public static void main(String[] args) throws ClientProtocolException, IOException {

    DefaultHttpClient httpClient = new DefaultHttpClient();

        httpClient.getCredentialsProvider().setCredentials(
                new AuthScope("9.5.127.34", 80),
                new UsernamePasswordCredentials("root", "passw0rd"));

        String url_copied_from_firebug = "https://9.5.127.34/powervc/openstack/volume/v1/115e4ad38aef463e8f99991baad1f809//volumes/3627400b-cd98-46c7-a7e2-ebce587a0b05/restricted_metadata"
        HttpGet httpget = new HttpGet(url_copied_from_firebug);
        HttpResponse response = httpClient.execute(httpget);

        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line = "";
        while ((line = rd.readLine()) != null) {

            System.out.println(line);

            }   
        }
}

当我尝试运行代码时遇到的错误是

线程“main”中出现异常 javax.net.ssl.SSLPeerUnverifiedException:对等点未经过身份验证

我尝试将端口号从 80 更改为 443,但不起作用。我想我是从它开始的,可能会遗漏很多东西。请为我指明正确的方向。

提前致谢。

最佳答案

您的问题不是 HTTP 身份验证。您的 http 客户端无法通过证书颁发机构验证服务器的 ssl 证书 - 这可能是因为您使用的是自签名证书。

查看 HttpClient documentation有关如何自定义客户端以允许自签名证书的说明。

以下是创建接受所有证书和主机名的 HttpClient 的示例 - 只需记住将其与您信任的服务器一起使用即可:

    private DefaultHttpClient getSSLHttpClient(final URL url) throws RestClientException {
    try {
        final X509TrustManager trustManager = createTrustManager();
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(null, new TrustManager[]{trustManager}, null);
        SSLSocketFactory ssf = new SSLSocketFactory(ctx, createHostnameVerifier());
        AbstractHttpClient base = new DefaultHttpClient();
        ClientConnectionManager ccm = base.getConnectionManager();
        SchemeRegistry sr = ccm.getSchemeRegistry();
        sr.register(new Scheme(HTTPS, url.getPort(), ssf));
        return new DefaultHttpClient(ccm, base.getParams());
    } catch (final Exception e) {
        throw new RestClientException(FAILED_CREATING_CLIENT, "Failed creating http client",
                ExceptionUtils.getFullStackTrace(e));
    }
}


private X509TrustManager createTrustManager() {
    X509TrustManager tm = new X509TrustManager() {

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        @Override
        public void checkServerTrusted(final X509Certificate[] chain, final String authType) 
                throws CertificateException {
        }

        @Override
        public void checkClientTrusted(final X509Certificate[] chain, final String authType) 
                throws CertificateException {
        }
    };
    return tm;
}


private X509HostnameVerifier createHostnameVerifier() {
    X509HostnameVerifier verifier = new X509HostnameVerifier() {

        @Override
        public boolean verify(final String arg0, final SSLSession arg1) {
            return true;
        }

        @Override
        public void verify(final String host, final String[] cns, final String[] subjectAlts) 
                throws SSLException {
        }

        @Override
        public void verify(final String host, final X509Certificate cert) 
                throws SSLException {
        }

        @Override
        public void verify(final String host, final SSLSocket ssl) 
                throws IOException {
        }
    };
    return verifier;
}

关于java - 使用 HTTP Commons Client 在服务器上进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19657770/

相关文章:

java - 在java中压缩二进制数据

java - 无法在 spring data jpa 的 findAll 方法中使用规范

Java URLConnection - 我什么时候需要使用 connect() 方法?

java - AIX:IBM Java:java.net.SocketException:连接超时:可能是由于地址无效

Java PostMethod 与 xml

java - Dagger 2 注入(inject)子类

java - 输出程序的值

java - Apache Commons Http 客户端 - 注册客户端特定协议(protocol)

java - HttpClient 支持多种 TLS 协议(protocol)

json - Shopify 集成 : trouble on making authenticated requests