javax.net.ssl.SSLHandshakeException: java.Sicherheit.cert.CertPathValidatorException: Vertrauen-Anker für die Zertifizierung Pfad nicht gefunden
Bin ich mit dem Retrofit für den Zugang zu mein-REST-API. Jedoch, wenn ich meinen API hinter ssl und darauf zugreifen, indem http://myhost/myapi
dann bekomme ich diesen Fehler:
Brauche ich etwas extra zu tun jetzt, dass mein API ist hinter SSL?
Hier ist, wie ich eine Verbindung:
private final String API = "https://myhost/myapi";
private final RestAdapter REST_ADAPTER = new RestAdapter.Builder()
.setServer(API)
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
01-10 09:49:55.621 2076-2100/com.myapp.mobile D/Retrofit﹕ javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:401)
at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222)
at $Proxy12.signin(Native Method)
at com.myapp.loginactivity$3.doInBackground(LoginActivity.java:143)
at com.myapp.loginactivity$3.doInBackground(LoginActivity.java:136)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:282)
at org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:202)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:595)
at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method)
at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:398)
at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209)
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478)
at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433)
at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282)
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:90)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:48)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:287)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:222)
at $Proxy12.signin(Native Method)
at com.myapp.LoginActivity$3.doInBackground(LoginActivity.java:143)
at com.myapp.LoginActivity$3.doInBackground(LoginActivity.java:136)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:841)
- haben Sie dieses problem gelöst ?
- Wenn Sie nicht bereits gelöst, siehe: stackoverflow.com/a/31436459/4261176
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum dies auftreten, ist die JVM/Dalvik habe nicht das Vertrauen in die CA-Zertifikate in das system oder in das Benutzer-Zertifikat speichert.
Um dies zu beheben mit der Nachrüstung, Wenn Sie verwendet werden, okhttp, mit einem anderen client ist es sehr ähnlich.
Sie haben zu tun:
A). Erstellen Sie einen Zertifikatsspeicher enthalten den öffentlichen Schlüssel der CA. Um dies zu tun, müssen Sie starten nächste Skript für *nix.
Müssen Sie openssl installieren auf Ihrem Computer und download von https://www.bouncycastle.org/ das Glas bcprov-jdk16-1.46.jar. Laden Sie diese version nicht
andere, die in der version 1.5 x ist nicht kompatibel mit android 4.0.4.
B). Kopieren Sie die truststore-Datei mytruststore.bks im res/raw Ihres Projekts
C). Einstellung SSLContext der Verbindung:
retrofit
befestigen Sie dieseOkHttpClient
wie hier vorgeschlagen: github.com/square/retrofit/issues/265. Auch ich habe festgestellt, dass dies funktioniert nur mit:bcprov-jdk16-1.46.jar
sonst bekommen Sie diewrong version of keystore error
okHttpClient.setSslSocketFactory(..)
, jetzt sollteclient = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory()).build();
Gibt es 4 Möglichkeiten die ich kenne:
Ich nehme an, Sie wollen nicht bezahlen für diese, so dass ich denke, die eleganteste Lösung ist das erste, was erreicht werden kann auf diese Weise:
http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html
Dies kann aus verschiedenen Gründen passieren, einschließlich:
bitte schauen Sie sich diesen link zur Lösung: https://developer.android.com/training/articles/security-ssl.html#CommonProblems
Hallo, dasselbe problem habe ich gelöst Sie können versuchen, diese
java.Sicherheit.cert.CertPathValidatorException: Vertrauen-Anker für die Zertifizierung Pfad nicht gefunden.NETZWERK
SSL ist nicht ordnungsgemäß konfiguriert. Diese trustAnchor Fehler in der Regel bedeuten, dass der trust store nicht gefunden werden kann. Überprüfen Sie Ihre Konfiguration und stellen Sie sicher, dass Sie tatsächlich den Hinweis auf den trust store und, dass es im Ort.
Stellen Sie sicher, Sie haben eine
-Djavax.net.ssl.trustStore
system-Eigenschaft festlegen und anschließend kontrollieren, dass der Pfad führt tatsächlich in den trust store.Können Sie auch aktivieren Sie die SSL-debugging, indem Sie die Einstellung dieser Eigenschaft system
-Djavax.net.debug=all
. Innerhalb der debug-Ausgabe, die Sie werden feststellen, es besagt, dass es nicht finden können, den trust store.Ich diese Klasse verwenden und kein problem haben.
}