Java – Received fatal alert: handshake_failure : javax.net.ssl.SSLHandshakeException

curlhttpjavajava-8ssl

I am running the below code on Java 8,

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.json.JSONObject;

public class HttpPostReq {
public static void main(String args[]) {
    String restUrl = "https://connect-testing.urbanairship.com/api/events/";
    String username = "sample_connection";
    String password = "sample_connection";
    JSONObject jsonToSend = new JSONObject();
    String jsonData = jsonToSend.toString();
    HttpPostReq httpPostReq = new HttpPostReq();
    System.out.println(jsonData);
    HttpPost httpPost = httpPostReq.createConnectivity(restUrl, username, password);
    System.out.println(httpPost);
    httpPostReq.executeReq(jsonData, httpPost);
}

HttpPost createConnectivity(String restUrl, String username, String password) {
    HttpPost post = new HttpPost(restUrl);
    String auth = new StringBuffer(username).append(":").append(password).toString();
    byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")));
    String authHeader = "Basic " + new String(encodedAuth);
    System.out.println(authHeader);
    post.setHeader("Authorization", authHeader);
    post.setHeader("Content-Type", "application/x-www-form-urlencoded");
    post.setHeader("Accept", "application/vnd.urbanairship+x-ndjson; version=3;");
    post.setHeader("X-Stream", "true");
    return post;
}

void executeReq(String jsonData, HttpPost httpPost) {
    try {
        executeHttpRequest(jsonData, httpPost);
    } catch (UnsupportedEncodingException e) {
        System.out.println("error while encoding api url : " + e);
    } catch (IOException e) {
        System.out.println("ioException occured while sending http request : " + e);
    } catch (Exception e) {
        System.out.println("exception occured while sending http request : " + e);
    } finally {

    }
}

void executeHttpRequest(String jsonData, HttpPost httpPost) throws UnsupportedEncodingException, IOException {
    HttpResponse response = null;
    String line = "";
    StringBuffer result = new StringBuffer();
    httpPost.setEntity(new StringEntity(jsonData));
    HttpClient client = HttpClientBuilder.create().build();
    response = client.execute(httpPost);
    System.out.println("Post parameters : " + jsonData);
    System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    while ((line = reader.readLine()) != null) {
        result.append(line);
    }
    System.out.println(result.toString());
}
}

Getting exception as,

ioException occured while sending http request :
javax.net.ssl.SSLHandshakeException: Received fatal alert:
handshake_failure.

I am able to connect to through curl,

curl -vv https://connect-testing.urbanairship.com/api/events/ \
--compressed \
-u "sample_connection:sample_connection" \
-H "Accept: application/vnd.urbanairship+x-ndjson; version=3;" \
-d "{}"

Can anyone tell me whats wrong with my java code ?

Dependencies are as below,

<dependencies>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20090211</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.2</version>
    </dependency>

Best Answer

Might be a compatibility issue between the TLS protocol version or cipher suites used by the client and server.