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:

//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.

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