Ich versuche, HTTPS-Verbindungen mit HttpClient
lib herzustellen, aber das Problem ist, dass das Zertifikat nicht von einer anerkannten Zertifizierungsstelle ( Verisign , GlobalSIgn usw. ) signiert ist, die im Satz der vertrauenswürdigen Android-Zertifikate aufgeführt ist. Ich bekomme immer javax.net.ssl.SSLException: Not trusted server certificate
.
Ich habe Lösungen gesehen, bei denen Sie einfach alle Zertifikate akzeptieren, aber was ist, wenn ich den Benutzer fragen möchte?
Ich möchte einen Dialog ähnlich dem des Browsers erhalten, in dem der Benutzer entscheiden kann, ob er fortfahren möchte oder nicht. Am liebsten möchte ich den gleichen Zertifikatsspeicher wie den Browser verwenden. Irgendwelche Ideen?
Antworten:
Als erstes müssen Sie die Überprüfungsstufe festlegen. Solche Ebenen sind nicht so sehr:
Die Methode setHostnameVerifier () ist zwar für neue Bibliothek Apache veraltet, aber für die Version im Android SDK ist normal. Und so nehmen
ALLOW_ALL_HOSTNAME_VERIFIER
und setzen wir es in der MethodenfabrikSSLSocketFactory.setHostnameVerifier()
.Als nächstes müssen Sie unsere Factory für das Protokoll auf https einstellen. Rufen Sie dazu einfach die
SchemeRegistry.register()
Methode auf.Dann müssen Sie ein
DefaultHttpClient
mit erstellenSingleClientConnManager
. Auch im folgenden Code können Sie sehen, dass standardmäßig auch unser flag (ALLOW_ALL_HOSTNAME_VERIFIER
) von der Methode verwendet wirdHttpsURLConnection.setDefaultHostnameVerifier()
Der folgende Code funktioniert für mich:
quelle
org.apache.http.conn.ssl.SSLSocketFactory
warum will ich verwendenjavax.net.ssl.HttpsURLConnection
?Die folgenden Hauptschritte sind erforderlich, um eine gesicherte Verbindung von Zertifizierungsstellen herzustellen, die von der Android-Plattform nicht als vertrauenswürdig eingestuft werden.
Wie von vielen Benutzern gewünscht, habe ich die wichtigsten Teile meines Blog-Artikels hier gespiegelt :
java.net.ssl.HttpsURLConnection
(einfacher zu verstehen, leistungsfähiger).Schnapp dir die Zertifikate
Sie müssen alle Zertifikate, die eine Kette bilden, vom Endpunktzertifikat bis zur Stammzertifizierungsstelle erhalten. Dies bedeutet, dass alle (falls vorhanden) Zwischenzertifizierungsstellenzertifikate sowie das Stammzertifizierungsstellenzertifikat vorhanden sind. Sie müssen das Endpunktzertifikat nicht erhalten.
Erstellen Sie den Keystore
Laden Sie den BouncyCastle-Anbieter herunter und speichern Sie ihn an einem bekannten Ort. Stellen Sie außerdem sicher, dass Sie den Befehl keytool aufrufen können (normalerweise im Ordner bin Ihrer JRE-Installation).
Importieren Sie nun die erhaltenen Zertifikate (importieren Sie das Endpunktzertifikat nicht) in einen BouncyCastle-formatierten Keystore.
Ich habe es nicht getestet, aber ich denke, die Reihenfolge des Imports der Zertifikate ist wichtig. Dies bedeutet, dass Sie zuerst das unterste Zwischenzertifizierungsstellenzertifikat und dann bis zum Stammzertifizierungsstellenzertifikat importieren.
Mit dem folgenden Befehl wird ein neuer Schlüsselspeicher (falls nicht bereits vorhanden) mit dem Kennwort mysecret erstellt und das Zwischenzertifizierungsstellenzertifikat importiert. Ich habe auch den BouncyCastle-Anbieter definiert, der sich in meinem Dateisystem und im Keystore-Format befindet. Führen Sie diesen Befehl für jedes Zertifikat in der Kette aus.
Überprüfen Sie, ob die Zertifikate korrekt in den Keystore importiert wurden:
Sollte die gesamte Kette ausgeben:
Jetzt können Sie den Keystore als Rohstoff in Ihre Android-App unter kopieren
res/raw/
Verwenden Sie den Keystore in Ihrer App
Zunächst müssen wir einen benutzerdefinierten Apache HttpClient erstellen, der unseren Keystore für HTTPS-Verbindungen verwendet:
Wir haben unseren benutzerdefinierten HttpClient erstellt und können ihn jetzt für sichere Verbindungen verwenden. Zum Beispiel, wenn wir eine REST-Ressource mit GET aufrufen:
Das ist es ;)
quelle
/res/raw/mykeystore.bks
, obwohl ich den Verweis darauf nicht auflösen kann. wie kann man das lösen?Wenn Sie ein benutzerdefiniertes / selbstsigniertes Zertifikat auf dem Server haben, das nicht auf dem Gerät vorhanden ist, können Sie es mit der folgenden Klasse laden und auf der Clientseite in Android verwenden:
Legen Sie das Zertifikat -
*.crt
Datei in/res/raw
so dass es verfügbar ist vonR.raw.*
Verwenden Sie die folgende Klasse, um eine
HTTPClient
oderHttpsURLConnection
eine Socket-Fabrik zu erhalten, die dieses Zertifikat verwendet:Wichtige Punkte:
Certificate
Objekte werden generiert aus.crt
Dateien .KeyStore
wird erstellt.keyStore.setCertificateEntry("ca", cert)
fügt dem Schlüsselspeicher unter dem Alias "ca" ein Zertifikat hinzu. Sie ändern den Code, um weitere Zertifikate hinzuzufügen (Zwischenzertifizierungsstelle usw.).SSLSocketFactory
das dann vonHTTPClient
oder verwendet werden kannHttpsURLConnection
.SSLSocketFactory
kann weiter konfiguriert werden, um beispielsweise die Überprüfung des Hostnamens zu überspringen usw.Weitere Informationen unter: http://developer.android.com/training/articles/security-ssl.html
quelle
.crt
Dateien herunterladen? Von einem Server herunterladen?Ich war frustriert, als ich versuchte, meine Android-App über https mit meinem RESTful-Dienst zu verbinden. Außerdem war ich etwas verärgert über all die Antworten, die darauf hinwiesen, die Zertifikatsprüfung insgesamt zu deaktivieren. Wenn Sie dies tun, worum geht es bei https?
Nachdem ich eine Weile über das Thema gegoogelt hatte, fand ich endlich diese Lösung, bei der keine externen Gläser benötigt werden, sondern nur Android-APIs. Vielen Dank an Andrew Smith, der es im Juli 2014 gepostet hat
Es hat gut funktioniert für meine Modell-App.
quelle
import java.security.cert.X509Certificate;
Die Top-Antwort hat bei mir nicht funktioniert. Nach einigen Nachforschungen fand ich die erforderlichen Informationen zu "Android Developer": https://developer.android.com/training/articles/security-ssl.html#SelfSigned
Das Erstellen einer leeren Implementierung von X509TrustManager hat den Trick gemacht:
Bitte beachten Sie, dass diese leere Implementierung von TustManager nur ein Beispiel ist und die Verwendung in einer produktiven Umgebung eine ernsthafte Sicherheitsbedrohung darstellen würde!
quelle
Google empfiehlt die Verwendung von Android Volley für HTTP / HTTPS-Verbindungen , da dies
HttpClient
veraltet ist. Sie kennen also die richtige Wahl :).Und NIE NUKE SSL-Zertifikate (NIE !!!).
SSL-Zertifikate zu zerstören, ist völlig gegen den Zweck von SSL, das die Sicherheit fördert . Es macht keinen Sinn, SSL zu verwenden, wenn Sie alle kommenden SSL-Zertifikate bombardieren möchten. Eine bessere Lösung wäre, kein SSL zu verwenden, oder eine bessere Lösung wäre das Erstellen einer benutzerdefinierten Lösung
TrustManager
mit Android Volley für HTTP / HTTPS-Verbindungen für Ihre App + .Hier ist ein Gist , die ich erstellt, mit einer grundlegenden LoginApp, HTTPS - Verbindungen durchgeführt wird , ein selbstsigniertes Zertifikat auf der Server-Seite verwenden, auf dem App akzeptiert.
Hier ist auch eine weitere Übersicht , die hilfreich sein kann, um selbstsignierte SSL-Zertifikate zum Einrichten auf Ihrem Server und zum Verwenden des Zertifikats in Ihrer App zu erstellen. Sehr wichtig: Sie müssen die vom obigen Skript generierte CRT-Datei aus Ihrem Android-Projekt in das Verzeichnis "raw" kopieren.
quelle
So können Sie Ihrem KeyStore zusätzliche Zertifikate hinzufügen, um dieses Problem zu vermeiden: Vertrauen aller Zertifikate mit HttpClient über HTTPS
Es wird den Benutzer nicht wie gewünscht dazu auffordern, aber es wird weniger wahrscheinlich, dass dem Benutzer der Fehler "Nicht vertrauenswürdiges Serverzertifikat" angezeigt wird.
quelle
Einfachste Möglichkeit zum Erstellen eines SSL-Zertifikats
Open Firefox (ich nehme an, es ist auch mit Chrome möglich, aber mit FF ist es für mich einfacher)
Besuchen Sie Ihre Entwicklungssite mit einem selbstsignierten SSL-Zertifikat.
Klicken Sie auf das Zertifikat (neben dem Site-Namen).
Klicken Sie auf "Weitere Informationen"
Klicken Sie auf "Zertifikat anzeigen"
Klicken Sie auf "Details"
Klicken Sie auf "Exportieren ..."
Wählen Sie "X.509-Zertifikat mit Kette (PEM)", wählen Sie den Ordner und den Namen aus, um es zu speichern, und klicken Sie auf "Speichern".
Gehen Sie zur Befehlszeile in das Verzeichnis, in das Sie die PEM-Datei heruntergeladen haben, und führen Sie "openssl x509 -inform PEM -outform DM -in .pem -out .crt" aus.
Kopieren Sie die CRT-Datei in das Stammverzeichnis des Ordners / sdcard auf Ihrem Android-Gerät. Wählen Sie auf Ihrem Android-Gerät Einstellungen> Sicherheit> Vom Speicher installieren.
Das Zertifikat sollte erkannt werden, und Sie können es dem Gerät hinzufügen. Navigieren Sie zu Ihrer Entwicklungssite.
Beim ersten Mal sollten Sie aufgefordert werden, die Sicherheitsausnahme zu bestätigen. Das ist alles.
Das Zertifikat sollte mit jedem auf Ihrem Android installierten Browser funktionieren (Browser, Chrome, Opera, Dolphin ...).
Denken Sie daran, dass Sie das Zertifikat für diese Domäne hinzufügen müssen, wenn Sie Ihre statischen Dateien von einer anderen Domäne aus bereitstellen (wir sind alle Hündinnen mit Seitengeschwindigkeit).
quelle
Ich schrieb kleine Bibliothek ssl-utils-android um einem bestimmten Zertifikat auf Android zu vertrauen.
Sie können einfach jedes Zertifikat laden, indem Sie den Dateinamen aus dem Assets-Verzeichnis angeben.
Verwendung:
quelle
Keines dieser Fixes funktionierte für meine Entwicklungsplattform für SDK 16, Release 4.1.2. Daher habe ich eine Problemumgehung gefunden.
Meine App speichert Daten auf dem Server unter Verwendung von " http://www.example.com/page.php?data=somedata ".
Kürzlich wurde page.php nach " https://www.secure-example.com/page.php " verschoben und ich erhalte weiterhin "javax.net.ssl.SSLException: Nicht vertrauenswürdiges Serverzertifikat".
Anstatt alle Zertifikate für nur eine Seite zu akzeptieren, löste ich mit diesem Handbuch mein Problem beim Schreiben meiner eigenen page.php, die auf " http://www.example.com/page.php " veröffentlicht wurde.
quelle
19. Januar 2020 Selbstsigniertes Zertifikat AUSGABE FIX:
Um Videos, Bilder abzuspielen, den Webservice für ein selbstsigniertes Zertifikat aufzurufen oder eine Verbindung zu einer ungesicherten URL herzustellen, rufen Sie einfach diese Methode auf, bevor Sie eine Aktion ausführen. Dadurch wird Ihr Problem bezüglich des Zertifikatproblems behoben:
KOTLIN CODE
quelle
Vielleicht ist dies hilfreich ... es funktioniert auf Java-Clients, die selbstsignierte Zertifikate verwenden (das Zertifikat wird nicht überprüft). Seien Sie vorsichtig und verwenden Sie es nur für Entwicklungsfälle, da dies überhaupt nicht sicher ist !!
So ignorieren Sie SSL-Zertifikatfehler in Apache HttpClient 4.0
Hoffe, es wird auf Android funktionieren, wenn Sie nur die HttpClient-Bibliothek hinzufügen ... viel Glück!
quelle
Dies ist ein Problem, das auf mangelnde SNI-Unterstützung (Server Name Identification) in A, ndroid 2.x zurückzuführen ist. Ich hatte eine Woche lang mit diesem Problem zu kämpfen, bis ich auf die folgende Frage stieß, die nicht nur einen guten Hintergrund des Problems bietet, sondern auch eine funktionierende und effektive Lösung ohne Sicherheitslücken bietet.
Fehler 'Kein Peer-Zertifikat' in Android 2.3, aber NICHT in 4
quelle