Erstellen Sie SSL-Socket auf Android mit selbst signiertem Zertifikat

Ich versuche, eine Android-App mit einem SSL-fähigen Server zu verbinden, der ein selbst signiertes Zertifikat verwendet. Ich habe bereits Dutzende von Tutorials gelesen und die App akzeptiert jetzt das Zertifikat und die Verbindung zum Server, aber ich bekomme niemals irgendwelche Daten zurück.

Der ursprüngliche Code, den ich zur Initialisierung der Steckdose verwendet habe, ist:

  • ExpandableListView mit Mehrfachauswahl speichert das ausgewählte Element in ein Array
  • Wie implementiere ich Suchbar wie Google Mail App in Android?
  • RadioButton nicht korrekt zeichnen
  • So deaktiviere ich die Schaltfläche "Zurück", wenn das Warnfeld auf dem Bildschirm ist
  • Seite curl mit Ansicht Pager
  • Ändern Sie den Stil von android MediaController
  • //passphrase for keystore char[] keystorePass="password".toCharArray(); //load own keystore (MyApp just holds reference to application context) KeyStore keyStore=KeyStore.getInstance("BKS"); keyStore.load(MyApp.getStaticApplicationContext().getResources().openRawResource(R.raw.keystore),keystorePass); //create a factory TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); //get context SSLContext sslContext=SSLContext.getInstance("TLS"); //init context sslContext.init( null, trustManagerFactory.getTrustManagers(), new SecureRandom() ); //create the socket Socket socket=sslContext.getSocketFactory().createSocket("hostname",443); socket.setKeepAlive(true); 

    Danach verwendet die Laufschleife des Receiver-Threads socket.getInputStream (), um auf den Eingangsstrom zuzugreifen. Solange ich eine unverschlüsselte Verbindung verwende, funktioniert das problemlos. Aber die sichere Verbindung ruft keine Daten aus dem Socket ab. Ich habe dies durch Hinzufügen von Log-Nachrichten an die Empfangsschleife und sogar verwendet OpenSSL s_server zu überprüfen. Ich habe Daten vom Client abgerufen, aber der Kunde hat nie etwas empfangen, das ich dazu geschickt habe.

    Als letzter Test habe ich versucht, eine Verbindung zu www.google.com:443 wie folgt zu öffnen:

     javax.net.SocketFactory fact=SSLSocketFactory.getDefault(); Socket socket=fact.createSocket(_config.getUri().getHost(), _config.getUri().getPort()); 

    Immer noch das gleiche Ergebnis, Verbindung funktioniert aber mit dem InputStream Ich bekomme nichts vom Server.

    Jemand hat irgendwelche Ideen?

    BEARBEITEN:

    Ich bin derzeit nicht erlaubt, meine eigene Frage zu beantworten, aber hier ist die Antwort: Nun, stellt sich das Problem WAS die Empfangsschleife. Ich verließ mich auf InputStream.available() , um die Anzahl der Bytes zu lesen, aber wusste nicht, dass es eher unzuverlässig war (gibt immer 0 für SSL-Sockel). Also habe ich die Empfangsschleife umgeschaltet, um das Blocking read() verwenden.

  • Unicode-Unterstützung in Android ndk
  • Android-Anwendung erfordert große Datendateien
  • Halten Sie die Dinge dezentral Android
  • Wie bekomme ich den Benutzer Home / Work Ort für einen Benutzer in Android
  • Android x86 Virtualbox + Kamera
  • Hinzufügen von touchListener zum Pfadobjekt
  • One Solution collect form web for “Erstellen Sie SSL-Socket auf Android mit selbst signiertem Zertifikat”

    Wie oben erwähnt: stellt das Problem WAS die Empfangsschleife dar. Ich verließ mich auf InputStream.available() , um die Anzahl der Bytes zu lesen, aber wusste nicht, dass es eher unzuverlässig war (gibt immer 0 für SSL-Sockel). Also habe ich die Empfangsschleife umgeschaltet, um das Blocking read() verwenden.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.