Sending SSL/https Request in Java

Have you ever encounter “javax.net.ssl.SSLHandshakeException” while sending SSL (https) request in java? If yes, then this article is for you. This article will show you how to send post request in java using ssl/https.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
	at sun.security.ssl.Alerts.getSSLException(Unknown Source)
	at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
	at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
	at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
	at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
	at sun.security.ssl.Handshaker.processLoop(Unknown Source)
	at sun.security.ssl.Handshaker.process_record(Unknown Source)
	at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
	at com.techgig365.http.HttpsURLConnectionExample.sendPostRequest(HttpsURLConnectionExample.java:84)
	at com.techgig365.http.HttpsURLConnectionExample.main(HttpsURLConnectionExample.java:38)
Caused by: sun.security.validator.ValidatorException: No trusted certificate found
	at sun.security.validator.SimpleValidator.buildTrustedChain(Unknown Source)
	at sun.security.validator.SimpleValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
	at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
	at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	... 13 more

Below example will use the java in built API’s to send the POST request to https enabled URL in simple way. Below are the API’s used in this example.

  • javax.net.ssl.HttpsURLConnection (HttpsURLConnection)
  • javax.net.ssl.KeyManager (KeyManager)
  • javax.net.ssl.KeyManagerFactory (KeyManagerFactory)
  • javax.net.ssl.SSLContext (SSLContext)
  • javax.net.ssl.TrustManager (TrustManager)
  • javax.net.ssl.TrustManagerFactory (TrustManagerFactory)

Preview(opens in a new tab)

Note : Make sure that you must have valid certificates loaded in your keystore before running this program.

package com.techgig365.http;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyStore;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public class HttpsURLConnectionExample {

	public final static String SSL_JAVA_PROTOCOL_HANDLER_PKGS = "sun.net.www.protocol";

	private SSLContext moSSLContext = null;

	public static void main(String[] args) {

		HttpsURLConnectionExample httpsURLConnectionExample = new HttpsURLConnectionExample();
		
		String URL = "https://httpbin.org/post";
		String requestData = "{'messageType':'myMessage'}";
		String keystore = "d:/myKeystore";
		String passphrase = "changeit";
		boolean verifyHost = true;

		httpsURLConnectionExample.sendPostRequest(URL, requestData, keystore, passphrase, verifyHost);

	}

	public void sendPostRequest(String url, String urlParameters, String keystore, String passphrase,
			boolean verifyHost) {

		OutputStreamWriter oWriter = null;
		HttpsURLConnection oHttpConn = null;

		try {

			System.setProperty("java.protocol.handler.pkgs", SSL_JAVA_PROTOCOL_HANDLER_PKGS);

			// Create HTTPSConnection
			URL aoURL = new URL(url);

			URLConnection conn = aoURL.openConnection();

			oHttpConn = (HttpsURLConnection) conn;

			// Load KeyStore + TrustStore and set SSLContext
			setSSLContext(keystore, passphrase);

			// Set SSLSocket factory
			oHttpConn.setSSLSocketFactory(moSSLContext.getSocketFactory());

			HostnameVerifier hostnameVerifier = new HostnameVerifier() {

				@Override
				public boolean verify(String hostname, SSLSession session) {
					System.out.println("Warning URL Host : " + hostname + "v/s" + session.getPeerHost());
					return true;
				}
			};

			oHttpConn.setHostnameVerifier(hostnameVerifier);

			oHttpConn.setRequestMethod("POST");
			oHttpConn.setRequestProperty("Keep-Alive", "true");
			oHttpConn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
			oHttpConn.setDoOutput(true);
			oHttpConn.setDoInput(true);
			oHttpConn.setConnectTimeout(10 * 1000);
			oHttpConn.setReadTimeout(10 * 1000);

			oHttpConn.connect();

			// Send the Request
			oWriter = new OutputStreamWriter(oHttpConn.getOutputStream());
			oWriter.write(urlParameters);
			oWriter.flush();

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

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

				String line;
				StringBuilder response = new StringBuilder();

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

				// Show result
				System.out.println(response.toString());

			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public void setSSLContext(String strKeyStoreAdd, String strKeyStorePwd) {
		InputStream oFIS = null;
		try {

			System.setProperty("java.protocol.handler.pkgs", SSL_JAVA_PROTOCOL_HANDLER_PKGS);

			// Create KeyStore object
			KeyStore oKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
			oFIS = new FileInputStream(new File(strKeyStoreAdd));
			oKeyStore.load(oFIS, strKeyStorePwd.toCharArray());

			// Create KeyManagerFactory object
			KeyManagerFactory oKeyManagerFactory = KeyManagerFactory.getInstance("SunX509");
			oKeyManagerFactory.init(oKeyStore, strKeyStorePwd.toCharArray());
			KeyManager[] km = oKeyManagerFactory.getKeyManagers();

			// Create TrustManagerFactory
			TrustManagerFactory oTrustManagerFactory = TrustManagerFactory.getInstance("SunX509");
			oTrustManagerFactory.init(oKeyStore);
			TrustManager[] tm = oTrustManagerFactory.getTrustManagers();

			// Initialize moSSLContext
			moSSLContext = SSLContext.getInstance("TLSV1.2");
			moSSLContext.init(km, tm, null);

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Leave a comment

Design a site like this with WordPress.com
Get started