2017-05-23 4 views
1

Mon application java avait été Worning bien jusqu'à ce que j'ai essayé de le compiler et je suis arrivé cette erreur:javax.net.ssl.SSLHandshakeException lorsque vous essayez de compiler l'application

build.xml:246: 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 
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1914) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:279) 
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:273) 
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1477) 
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:213) 
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:961) 
at sun.security.ssl.Handshaker.process_record(Handshaker.java:897) 
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1033) 
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1342) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1369) 
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1353) 
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559) 
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153) 
at org.apache.tools.ant.taskdefs.Get$GetThread.openConnection(Get.java:690) 
at org.apache.tools.ant.taskdefs.Get$GetThread.openConnection(Get.java:715) 
at org.apache.tools.ant.taskdefs.Get$GetThread.get(Get.java:606) 
at org.apache.tools.ant.taskdefs.Get$GetThread.run(Get.java:596) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) 
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
at sun.security.validator.Validator.validate(Validator.java:260) 
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) 
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) 
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) 
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1459) 
... 14 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) 
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) 
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) 
... 20 more 

j'étais recompilée parce que je l'avais fait une changer mais une fois que j'ai eu cette erreur, j'ai pris le changement et toujours obtenir cela.

Est-ce que quelqu'un sait ce qui pourrait l'avoir causé ou ce qui peut avoir soudainement changé sur mon serveur?

+0

[Est-ce que cela aide] (https://stackoverflow.com/a/9619478/1790644)? –

+0

Merci Matt. Cela a fait l'affaire. – runnerpaul

Répondre

0

build.xml:246: 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

Cela signifie lors de la construction du code se connecte à un serveur SSL, mais le certificat du serveur ne fait confiance par le client. Ce sont toutes les informations que nous avons de l'exception.

Il ne dit rien sur la raison.

Habituellement certificat du serveur (ou il est CA) ne sont pas en confiance (pas dans le truststore configuré ou par défaut) ou le nom d'hôte du serveur ne correspond pas avec le certificat CN (je crois que vous obtiendriez une autre exception, je Pariez sur le truststore).

1

Essayez ci-dessous solution pour la certification de dérivation lorsque vous appelez Https api

1) HttpsTrustManager.java classe

import java.security.KeyManagementException; 
import java.security.NoSuchAlgorithmException; 
import java.security.SecureRandom; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class HttpsTrustManager implements X509TrustManager { 

    private static TrustManager[] trustManagers; 
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{}; 

    @Override 
    public void checkClientTrusted(
      java.security.cert.X509Certificate[] x509Certificates, String s) 
      throws java.security.cert.CertificateException { 

    } 

    @Override 
    public void checkServerTrusted(
      java.security.cert.X509Certificate[] x509Certificates, String s) 
      throws java.security.cert.CertificateException { 

    } 

    public boolean isClientTrusted(X509Certificate[] chain) { 
     return true; 
    } 

    public boolean isServerTrusted(X509Certificate[] chain) { 
     return true; 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return _AcceptedIssuers; 
    } 

    public static void allowAllSSL() { 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 

      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return true; 
      } 

     }); 

     SSLContext context = null; 
     if (trustManagers == null) { 
      trustManagers = new TrustManager[]{new HttpsTrustManager()}; 
     } 

     try { 
      context = SSLContext.getInstance("TLS"); 
      context.init(null, trustManagers, new SecureRandom()); 
     } catch (NoSuchAlgorithmException e) { 
      //e.printStackTrace(); 
     } catch (KeyManagementException e) { 
      //e.printStackTrace(); 
     } 

     HttpsURLConnection.setDefaultSSLSocketFactory(context 
       .getSocketFactory()); 
    } 

} 

2) appellent maintenant ci-dessous fonction avant l'appel api comme bwlow

public static void getServerData(final Context cntx) { 
      myNotificationDb = new Notification_Db(cntx); 
      RequestQueue queue = Volley.newRequestQueue(cntx); 

      HttpsTrustManager.allowAllSSL(); 

      JsonObjectRequest jsObjRequest = new JsonObjectRequest(
        Request.Method.GET, "Url", null, 
        new Response.Listener<JSONObject>() { 

         @Override 
         public void onResponse(JSONObject response) { 

          // Your response 

         } 
        }, new Response.ErrorListener() { 

         @Override 
         public void onErrorResponse(VolleyError error) { 
          // TODO Auto-generated method stub 

         } 

        }) { 
       @Override 
       public Map<String, String> getHeaders() throws AuthFailureError { 

        // Your header parameter if you have otherwise this is optional 

        return headers; 
       } 
      }; 



queue.add(jsObjRequest); 
    }