Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to solve javax.net.ssl.SSLHandshakeException Error?

I connected with VPN to setup the inventory API to get product list and it works fine. Once I get the result from the web-service and i bind to UI. And also I integrated PayPal with my application for make Express checkout when I make a call for payment I'm facing this error. I use servlet for back-end process. Can any one say how to fix this issue?

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:  PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
like image 256
selladurai Avatar asked Jul 12 '11 04:07

selladurai


People also ask

What causes SSLHandshakeException?

The SSLHandshakeException is thrown when an error occurs while a client and server connection fails to agree on their desired security level. This exception is one of a handful of classes that inherits from the parent SSLException class.

What is javax net SSL SSLProtocolException?

Class SSLProtocolExceptionReports an error in the operation of the SSL protocol. Normally this indicates a flaw in one of the protocol implementations.


2 Answers

First, you need to obtain the public certificate from the server you're trying to connect to. That can be done in a variety of ways, such as contacting the server admin and asking for it, using OpenSSL to download it, or, since this appears to be an HTTP server, connecting to it with any browser, viewing the page's security info, and saving a copy of the certificate. (Google should be able to tell you exactly what to do for your specific browser.)

Now that you have the certificate saved in a file, you need to add it to your JVM's trust store. At $JAVA_HOME/jre/lib/security/ for JREs or $JAVA_HOME/lib/security for JDKs, there's a file named cacerts, which comes with Java and contains the public certificates of the well-known Certifying Authorities. To import the new cert, run keytool as a user who has permission to write to cacerts:

keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file> 

It will most likely ask you for a password. The default password as shipped with Java is changeit. Almost nobody changes it. After you complete these relatively simple steps, you'll be communicating securely and with the assurance that you're talking to the right server and only the right server (as long as they don't lose their private key).

like image 110
Ryan Stewart Avatar answered Sep 23 '22 07:09

Ryan Stewart


Now I solved this issue in this way,

import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.OutputStream;   // Create a trust manager that does not validate certificate chains like the default   TrustManager[] trustAllCerts = new TrustManager[]{         new X509TrustManager() {              public java.security.cert.X509Certificate[] getAcceptedIssuers()             {                 return null;             }             public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)             {                 //No need to implement.             }             public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)             {                 //No need to implement.             }         } };  // Install the all-trusting trust manager try  {     SSLContext sc = SSLContext.getInstance("SSL");     sc.init(null, trustAllCerts, new java.security.SecureRandom());     HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); }  catch (Exception e)  {     System.out.println(e); } 

Of course this solution should only be used in scenarios, where it is not possible to install the required certifcates using keytool e.g. local testing with temporary certifcates.

like image 45
selladurai Avatar answered Sep 22 '22 07:09

selladurai