Android HttpsUrlConnection javax.net.ssl.SSLException Die Verbindung wurde durch einen Peer-Handshake-Fehler geschlossen, wenn der lokale Truststore verwendet wurde

8

Ich habe Schwierigkeiten, Android dazu zu bringen, mit dem OpenSSL -Objekt eine Verbindung zu einem einfachen HttpsUrlConnection -Server herzustellen (Ich habe StackOverflow und eine Reihe von Online-Tutorials durchgekämmt und den Beispielen so ziemlich Zeile für Zeile gefolgt Ich kann immer noch nicht herausfinden, warum meine kaputt ist, wenn ich meinen lokalen Truststore verwende.

Ich habe derzeit eine Android-Aktivität, die versucht, eine Verbindung zu einem einfachen OpenSSL server herzustellen (ich kann mit einem OpenSSL-Client eine Verbindung zu meinem Server herstellen). Sobald% code_% aufgerufen wird, erhalte ich " HttpsUrlConnection.connect() Vielleicht setze ich herauf meinen Beispielserver falsch?

Zu beachten:

  • zur Zeit keine Kundenautorisierung
  • kann beim Laden des Standard-Trust-Stores
  • eine Verbindung zu Ссылка herstellen
  • kann keine Verbindung zum Server auf localhost mit selbstsigniertem Zertifikat herstellen
  • möchte nicht allen Zertifikaten vertrauen
  • möchte nicht Apache HttpClient
  • verwenden
  • möchte nur den lokalen Truststore verwenden
  • erstellt lokalen Truststore mit Hüpfburg
  • kann Truststore korrekt in
  • laden
  • hinter einer Proxy-Firewall, Proxy ist auf meinem Android Virtual Device
  • gesetzt
  • AVD wurde auf javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake. gesetzt.

Dinge, die ich schon versucht habe:

  • Verbindung zu beiden Android 4.1 API 16
  • mit einem neuen 127.0.0.1 and 10.0.2.2
  • Erstellen der URL mit SecureRandom() with the SSLContext.init()
  • mit 'URL u = new URL("https", "10.0.2.2", 443, "/");' anstelle von "X509"
    • gibt TrustManagerFactory.getDefaultAlgorithms() anstelle von "Verbindung geschlossen durch Peer"
    • an

Vielen Dank im Voraus, dass Sie sich die Zeit genommen haben, meine Frage zu überprüfen!

Einfacher Server gestartet mit Befehl:

%Vor%

Clientverbindung getestet mit Befehl:

%Vor%

Android-Aktivitätscode (bearbeitet, um den gesamten laufenden Code zur Vereinfachung zu entfernen - bitte lassen Sie mich wissen, wenn mehr Code benötigt wird) - die Fehlerausgabe liegt unter dem Code.

%Vor%

Wird ausgegeben, wenn die Verbindung zu Ссылка ordnungsgemäß hergestellt wurde:

%Vor%

Ausgabe beim Versuch, eine Verbindung zu meinem Server mit selbstsigniertem Zertifikat herzustellen:

%Vor%

Nochmals vielen Dank !!

    
aspergillusOryzae 10.09.2012, 06:29
quelle

2 Antworten

6

Ich habe mein Problem gelöst - ich musste ein Zertifikat mit 10.0.2.2 als allgemeinen Namen (CN) verwenden, damit es mit der lokalen IP-Adresse von Android localhost von 10.0.2.2 anstelle von "localhost" oder "127.0.0.1" übereinstimmt.

Bearbeiten: Sie könnten wahrscheinlich ein Zertifikat mit localhost als CN und '127.0.0.1' und '10 .0.2.2 'als alternativen Antragstellernamen (SAN) erstellen.

Nachdem ich 10.0.2.2 cert und private key pem-Dateien erstellt hatte, konnte ich meinen Server mit dem folgenden Befehl starten:

%Vor%

Wenn Sie den Client zwingen möchten, ein Zertifikat bereitzustellen (obwohl es nicht überprüft wird), fügen Sie dem obigen Befehl das Flag -Verify 1 hinzu.

Um den Server über die Befehlszeile zu testen, können Sie Folgendes verwenden (Hinweis: openssl kann über 127.0.0.1 eine Verbindung herstellen):

%Vor%

Um ein Client-Zertifikat hinzuzufügen, wenn der Server es benötigt, fügen Sie die Flags -cert client-cert.pem -key client-key.pem

hinzu

In meinem Android-Client habe ich den folgenden Code zum Verbinden verwendet (Fehlerüberprüfung wurde entfernt):

%Vor%

Sie sollten einen Antwortcode von 200 erhalten und die Antwort von dort analysieren können.

Hier ist der Code zum Laden der Client-Anmeldeinformationen, der identisch ist mit dem Laden des Server-Keystores, aber mit einem anderen Ressourcendateinamen und einem anderen Passwort:

%Vor%     
aspergillusOryzae 03.10.2012, 09:17
quelle
2

Ich habe meine 6 - 7 Stunden verschwendet, um dieses Problem zu beheben und schließlich hat es mit

funktioniert %Vor%

Und es hat funktioniert !!!!!!

    
sidhanshu 22.02.2016 16:12
quelle