Ich versuche, eine Verbindung zu einer IIS6-Box herzustellen, auf der ein Godaddy 256-Bit-SSL-Zertifikat ausgeführt wird, und es wird folgende Fehlermeldung angezeigt:
java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Ich habe versucht herauszufinden, was das verursachen könnte, aber jetzt Leerzeichen gezogen.
So verbinde ich mich:
HttpsURLConnection conn;
conn = (HttpsURLConnection) (new URL(mURL)).openConnection();
conn.setConnectTimeout(20000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
String tempString = toString(conn.getInputStream());
quelle
Im Gegensatz zur akzeptierten Antwort benötigen Sie keinen benutzerdefinierten Vertrauensmanager, sondern müssen Ihre Serverkonfiguration korrigieren!
Ich habe das gleiche Problem beim Herstellen einer Verbindung zu einem Apache-Server mit einem falsch installierten Dynadot / Alphassl-Zertifikat festgestellt. Ich verbinde mich mit HttpsUrlConnection (Java / Android), das geworfen hat -
Das eigentliche Problem ist eine Fehlkonfiguration des Servers. Testen Sie es mit http://www.digicert.com/help/ oder ähnlichem, und Sie erfahren sogar die Lösung:
"Das Zertifikat ist nicht von einer vertrauenswürdigen Behörde signiert (Überprüfung anhand des Mozilla-Stammspeichers). Wenn Sie das Zertifikat von einer vertrauenswürdigen Behörde gekauft haben, müssen Sie wahrscheinlich nur ein oder mehrere Zwischenzertifikate installieren . Wenden Sie sich an Ihren Zertifikatsanbieter, um diesbezüglich Unterstützung zu erhalten Serverplattform. "
Sie können das Zertifikat auch mit openssl überprüfen:
openssl s_client -debug -connect www.thedomaintocheck.com:443
Sie werden wahrscheinlich sehen:
Verify return code: 21 (unable to verify the first certificate)
und früher in der Ausgabe:
Die Zertifikatskette enthält nur 1 Element (Ihr Zertifikat):
... sollte aber die Signaturbehörden in einer Kette auf eine zurückführen, der Android vertraut (Verisign, GlobalSign usw.):
Anweisungen (und die Zwischenzertifikate) zum Konfigurieren Ihres Servers werden normalerweise von der Behörde bereitgestellt, die Ihr Zertifikat ausgestellt hat, z. B.: Http://www.alphassl.com/support/install-root-certificate.html
Nach der Installation der von meinem Zertifikatsaussteller bereitgestellten Zwischenzertifikate habe ich jetzt keine Fehler beim Herstellen einer Verbindung mit HttpsUrlConnection.
quelle
Sie können einem bestimmten Zertifikat zur Laufzeit vertrauen.
Laden Sie es einfach vom Server herunter, fügen Sie Assets ein und laden Sie es mit ssl-utils-android wie folgt :
Im obigen Beispiel habe ich verwendet
OkHttpClient
,SSLContext
kann aber mit jedem Client in Java verwendet werden.Wenn Sie Fragen haben, können Sie diese gerne stellen. Ich bin der Autor dieser kleinen Bibliothek.
quelle
Update basierend auf der neuesten Android-Dokumentation (März 2017):
Wenn Sie diese Art von Fehler erhalten:
Das Problem könnte eines der folgenden sein:
Die Lösung besteht darin, zu lehren
HttpsURLConnection
, einem bestimmten Satz von Zertifizierungsstellen zu vertrauen. Wie? Bitte überprüfen Sie https://developer.android.com/training/articles/security-ssl.html#CommonProblemsAndere, die
AsyncHTTPClient
aus dercom.loopj.android:android-async-http
Bibliothek verwenden, überprüfen bitte Setup AsyncHttpClient, um HTTPS zu verwenden .quelle
Wenn Sie eine Nachrüstung verwenden, müssen Sie Ihren OkHttpClient anpassen.
quelle
getUnsafeOkHttpClient()
in Kotlin wurde neu geschrieben: stackoverflow.com/a/60507560/2914140 .Antwort auf sehr alten Beitrag. Aber vielleicht hilft es einem Neuling und wenn keiner der oben genannten Punkte klappt.
Erklärung: Ich weiß, niemand will Erklärung Mist; eher die Lösung. In einem Liner versuchen Sie jedoch, von Ihrem lokalen Computer aus auf einen Dienst von einem Remotecomputer aus zuzugreifen, der Ihrem Computer nicht vertraut. Sie müssen das Vertrauen vom Remote-Server gewinnen.
Lösung: Bei der folgenden Lösung wird davon ausgegangen, dass die folgenden Bedingungen erfüllt sind
Schritte:
Sie benötigen eine .keystore-Erweiterungsdatei, um Ihre App anzumelden. Wenn Sie nicht wissen, wie Sie eine .keystore-Datei erstellen; Folgen Sie dann dem folgenden Abschnitt Erstellen einer .keystore-Datei oder fahren Sie auf andere Weise mit dem nächsten Abschnitt fort. Sign Apk File
Erstellen Sie eine .keystore-Datei
Öffnen Sie Android Studio. Klicken Sie auf das Hauptmenü Erstellen> Signierte APK generieren. Klicken Sie im nächsten Fenster auf die Schaltfläche Neu erstellen ... Bitte geben Sie im neuen Fenster Daten in alle Felder ein. Denken Sie daran, dass das von mir empfohlene Feld mit zwei Passwörtern dasselbe Passwort haben sollte. Verwenden Sie kein anderes Passwort. und merken Sie sich auch den Speicherpfad am obersten Feld Schlüsselspeicherpfad : . Nachdem Sie alle Felder eingegeben haben, klicken Sie auf OK.
Sign Apk-Datei
Jetzt müssen Sie eine signierte App mit der gerade erstellten .keystore-Datei erstellen. Folge diesen Schritten
Choose existing...
SchaltflächeKey store password
undKey password
Felder. Geben Sie auch den Alias einbuild.gradle
Dateien, müssen Sie wählenBuild Types
undFlavors
.Build Types
Auswahlrelease
aus der Dropdown-ListeFür
Flavors
jedoch wird es hängt von Ihren Einstellungen inbuild.gradle
Datei. Wählen Siestaging
aus diesem Feld. Ich habe die folgenden Einstellungen in verwendetbuild.gradle
, Sie können die gleichen wie meine verwenden, aber stellen Sie sicher, dass Sie dieapplicationId
in Ihren Paketnamen ändernKlicken Sie auf die beiden unteren
Signature Versions
Kontrollkästchen und dann auf dieFinish
Schaltfläche.Fast dort:
Die ganze harte Arbeit ist erledigt, jetzt die Bewegung der Wahrheit. Um auf den durch einen Proxy gesicherten Staging-Server zugreifen zu können, müssen Sie einige Einstellungen in Ihren realen Test-Android-Geräten vornehmen.
Proxy-Einstellung im Android-Gerät:
Modify network
Advanced options
Sie auf, wenn Sie dasProxy Hostname
Feld nicht sehen könnenProxy Hostname
die Host - IP eingeben oder benennen Sie anschließen möchten. Ein typischer Staging-Server wird als benanntstg.api.mygoodcompany.com
9502
Save
TasteEine letzte Station:
Denken Sie daran, dass wir die signierte apk-Datei im Abschnitt APK-Datei signieren generiert haben . Jetzt ist die Zeit gekommen, diese APK-Datei zu installieren.
adb install
name of the apk file
adb command not found
. Geben Sie den vollständigen Pfad als einC:\Users\shah\AppData\Local\Android\sdk\platform-tools\adb.exe
install
name of the apk file
Ich hoffe das Problem könnte gelöst werden. Wenn nicht, hinterlasse mir bitte einen Kommentar.
Salam!
quelle
Die Fehlermeldung, die ich erhielt, war ähnlich, aber der Grund war, dass das selbstsignierte Zertifikat abgelaufen war. Beim Versuch des openssl-Clients wurde der Grund angegeben, der beim Überprüfen des Zertifikatdialogs von Firefox übersehen wurde.
Wenn sich das Zertifikat im Schlüsselspeicher befindet und "GÜLTIG" ist, wird dieser Fehler im Allgemeinen ausgelöst.
quelle
TrustManager
und einen anderen Kriteriensatz zu verwenden. Aber sofort müssen Sie damit arbeiten.Ich hatte das gleiche Problem beim Herstellen einer Verbindung vom Android-Client zum Kurento-Server. Kurento-Server verwenden JKS-Zertifikate, daher musste ich PEM in dieses konvertieren. Als Eingabe für die Konvertierung habe ich die Datei cert.pem verwendet, die zu solchen Fehlern geführt hat. Wenn Sie jedoch fullchain.pem anstelle von cert.pem verwenden, ist alles in Ordnung.
quelle
Verwenden Sie https://www.ssllabs.com/ssltest/ , um eine Domain zu testen.
Die Lösung von Shihab Uddin in Kotlin.
quelle
Ich hatte das gleiche Problem, als ich feststellte, dass in der von mir bereitgestellten .crt-Datei des Zertifikats ein Zwischenzertifikat fehlte. Also habe ich alle .crt-Dateien von meinem Serveradministrator abgefragt und sie dann in umgekehrter Reihenfolge zusammengefasst.
Ex. 1. Root.crt 2. Inter.crt 3. myCrt.crt
In Windows habe ich die Kopie Inter.crt + Root.crt newCertificate.crt ausgeführt
(Hier habe ich myCrt.crt ignoriert)
Dann habe ich die Datei newCertificate.crt über den Inputstream in den Code eingefügt. Arbeit erledigt.
quelle
Der Trust-Ankerfehler kann aus vielen Gründen auftreten. Für mich war es einfach so, dass ich versuchte, darauf zuzugreifen,
https://example.com/
anstatthttps://www.example.com/
.Vielleicht möchten Sie Ihre URLs noch einmal überprüfen, bevor Sie mit dem Erstellen Ihres eigenen Trust Managers beginnen (wie ich).
quelle
Bei Lebkuchenhandys wird immer folgende Fehlermeldung angezeigt:
Trust Anchor not found for Android SSL Connection
Auch wenn ich , dass ich mich auf mein Zertifikat verlasse.Hier ist der Code, den ich verwende (in Scala-Sprache):
und hier ist der Verbindungscode:
Grundsätzlich richte ich so ein, dass ich meinem benutzerdefinierten Zertifikat vertraue. Wenn dies fehlschlägt, deaktiviere ich die Sicherheit. Dies ist nicht die beste Option, aber die einzige Wahl, die ich mit alten und fehlerhaften Telefonen kenne.
Dieser Beispielcode kann leicht in Java übersetzt werden.
quelle
In meinem Fall geschah dies nach dem Update auf Android 8.0. Das selbstsignierte Zertifikat, dem Android als vertrauenswürdig eingestuft wurde, verwendete den Signaturalgorithmus SHA1withRSA. Das Umschalten auf ein neues Zertifikat mithilfe des Signaturalgorithmus SHA256withRSA hat das Problem behoben.
quelle
Ich weiß, dass Sie nicht allen Zertifikaten vertrauen müssen, aber in meinem Fall hatte ich Probleme mit einigen Debugging-Umgebungen, in denen wir selbstsignierte Zertifikate hatten und ich eine schmutzige Lösung brauchte.
Alles was ich tun musste, war die Initialisierung des zu ändern
sslContext
wo
trustAllCerts
wurde so erstellt:Hoffe, dass dies nützlich sein wird.
quelle
Hostname '192.168.0.16' was not verified
. Ich teste mein Webapi lokal über meinen Debugger (IIS Express). Irgendeine Idee, wie man das behebt? Danke :)Ich hatte ein ähnliches Problem und habe die Strategie, allen Quellen zu vertrauen, völlig ausgeschlossen.
Ich teile hier meine Lösung für eine in Kotlin implementierte Anwendung
Ich würde zunächst empfehlen, die folgende Website zu verwenden zu verwenden, um Informationen über das Zertifikat und seine Gültigkeit zu erhalten
Wenn es im Standard-Trust Store von Android nicht als "Akzeptierte Emittenten" angezeigt wird , müssen wir dieses Zertifikat abrufen und in die Anwendung integrieren, um einen benutzerdefinierten Trust Store zu erstellen
Die ideale Lösung in meinem Fall war die Erstellung eines allgemeinen Vertrauensmanagers , der den benutzerdefinierten und den Standard-Vertrauensspeicher für Android kombiniert
Hier legt er den Code auf hoher Ebene offen, der zum Konfigurieren des OkHttpClient verwendet wird, den er mit Retrofit verwendet hat.
Auf diese Weise konnte ich mit dem Server mit einem selbstsignierten Zertifikat und mit anderen Servern mit einem Zertifikat kommunizieren, das von einer vertrauenswürdigen Zertifizierungsstelle ausgestellt wurde
Das ist es, ich hoffe es kann jemandem helfen.
quelle
Ich weiß, dass dies ein sehr alter Artikel ist, aber ich bin auf diesen Artikel gestoßen, als ich versucht habe, meine Vertrauensankerprobleme zu lösen. Ich habe gepostet, wie ich es behoben habe. Wenn Sie Ihre Stammzertifizierungsstelle vorinstalliert haben, müssen Sie dem Manifest eine Konfiguration hinzufügen.
https://stackoverflow.com/a/60102517/114265
quelle
quelle
Ich habe auch das gleiche Problem konfrontiert. Ich entferne nur hhtps zu http, wie z
final public static String ROOT_URL = "https://example.com";
zufinal public static String ROOT_URL = "http://example.com";
Schließlich habe ich dieses Problem gelöst.
quelle