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)
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();
}
}
}
