2017-05-23 5 views
1

Meine Java-Anwendung Worning in Ordnung war, bis ich versuchte, es wieder zusammenzustellen und ich habe diesen Fehler:javax.net.ssl.SSLHandshakeException, wenn sie versuchen Anwendung zu kompilieren

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 

Ich war neu zu kompilieren, weil ich ein gemacht hatte ändern, aber sobald ich diesen Fehler habe ich nahm die Änderung heraus und immer noch das.

Weiß jemand, was es verursachen könnte oder was sich plötzlich auf meinem Server geändert haben könnte?

+0

[Hilft das] (https://stackoverflow.com/a/9619478/1790644)? –

+0

Danke Matt. Das hat den Trick gemacht. – runnerpaul

Antwort

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

Das bedeutet, während des Baus der Code an einen SSL-Server verbindet, aber das Zertifikat des Servers wird vom Client nicht vertrauenswürdig. Das sind alles Informationen, die wir von der Ausnahme haben.

Es sagt nichts über den Grund.

Normalerweise ist das Zertifikat des Servers (oder dessen CA) nicht vertrauenswürdig (nicht im konfigurierten oder standardmäßigen Truststore) oder der Hostname des Servers stimmt nicht mit dem Zertifikats-CN überein (ich glaube, Sie würden eine weitere Ausnahme bekommen, also ich hätte auf den Truststore gewettet.

1

Versuchen unten Lösung für Bypass-Zertifizierung, wenn Sie anrufen Https api

1) Schreiben HttpsTrustManager.java Klasse

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) Jetzt unten Funktion aufrufen, bevor die api wie 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); 
    } 
nennen
Verwandte Themen