Java - 使用Apache httpclient进行HTTPS基本身份验证

时间:2017-04-26 21:30:40

标签: java https client basic-authentication apache-httpclient-4.x

我正在尝试从使用Apache httpclient进行基本身份验证的HTTPS服务器获取一些数据(json数据 - > restful server)。 SSL证书是自签名的。 服务器对浏览器调用响应非常好,并且在使用curl时也是如此。

然而,使用java Apache httpclient,这是另一个故事。

客户端:

基本身份验证正在运行:如果忘记授权标头或者我设置了错误的base64编码登录密码,服务器会向我发送401错误。

https / SSL部分正在运行:我成功从在线restful json服务器获取数据但遗憾的是找不到具有基本身份验证的在线restful json服务器以进行测试......

        try {

            CloseableHttpClient httpClient = null;
            try {
                httpClient = HttpClients.custom()
                        .setSSLSocketFactory(new SSLConnectionSocketFactory(SSLContexts.custom()
                                        .loadTrustMaterial(null, new TrustSelfSignedStrategy())
                                        .build()
                                )
                        )
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                        .build();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (KeyManagementException e) {
                e.printStackTrace();
            } catch (KeyStoreException e) {
                e.printStackTrace();
            }

            HttpGet getRequest = new HttpGet("https://localhost:5050/getdata");
            getRequest.addHeader("Accept", "*/*");
            getRequest.addHeader("Authorization", "Basic UBJ0aHVyOmFo0XElYHU=");
            HttpResponse response = httpClient.execute(getRequest);

调试告诉我:

Caused by: org.apache.http.ProtocolException: The server failed to respond with a valid HTTP response

真!它不是我想要的有效HTTP响应,它是一个有效的HTTP S 响应!

我想我错过了什么......

1 个答案:

答案 0 :(得分:2)

<强> 解决!

错误来自服务器端:我的回复中没有包含任何标题....

httpclient似乎喜欢来自服务器的良好响应。对于浏览器或curl来说,情况并非如此:垃圾可以接收,显示它们