Search code examples
javaapisslrequesthttpurlconnection

Received fatal alert: handshake_failure webservice


I have hired a web service that sends sms messages to mobile phone. I have tried to make the post request but I amb getting the error:

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

The webservice company gave me all the information needed for making the the url: the user, the password, the params needed, the response etc

The gsm param is the mobile phone number. msg is the message to send.

import java.net.HttpURLConnection;
import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;

import java.net.URL;

public class Test3 {

    public static void main(String[] args) throws Exception {

        Test3 obj = new Test3();
        System.out.println("Testing 1 - Send Http POST request");
        obj.sendPost();
     } 

    private void sendPost() throws Exception {

        //
        String url = "https://...url/send";//(that url its just an example, its not the real)

        HttpsURLConnection httpClient = (HttpsURLConnection) new URL(url).openConnection();

        //add reuqest header
        httpClient.setRequestMethod("POST");
        httpClient.setRequestProperty("User-Agent", "Mozilla/5.0");
        httpClient.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

        String urlParameters = "?user=TEST_USER&company=XXX&passwd=TEST_PWD&gsm=666000222&type=plus&msg=hello&sender=me";

        // Send post request
        httpClient.setDoOutput(true);
        try (DataOutputStream wr = new DataOutputStream(httpClient.getOutputStream())) {
            wr.writeBytes(urlParameters);
            wr.flush();
        }

        int responseCode = httpClient.getResponseCode();
        System.out.println("\nSending 'POST' request to URL : " + url);
        System.out.println("Post parameters : " + urlParameters);
        System.out.println("Response Code : " + responseCode);

        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(httpClient.getInputStream()))) {

            String line;
            StringBuilder response = new StringBuilder();

            while ((line = in.readLine()) != null) {
                response.append(line);
            }

            System.out.println(response.toString());

        }

    }
}

Also If I tried to acces the the webservice call by writting the url to the navbar of Mozilla Firefox I got that error:

Secure Connection Failed

An error occurred during a connection to 'url' SSL peer was unable to negotiate an acceptable set of security parameters.

Error code: SSL_ERROR_HANDSHAKE_FAILURE_ALERT

The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.

enter image description here


Solution

  • Given that the domain in question (push.tempos21.com) works for me with the browser but does not work for you neither with app nor browser, it is likely that it is not a problem of app or browser but of your connection to the target. I suspect that there is some deep inspection firewall or IPS somewhere in the path which allows the initial TCP connect but then blocks the traffic once the target is known from the ClientHello (start of TLS handshake).