2016-06-09 9 views
10

Chcę mieć zaszyfrowany serwer TCP TCP na urządzeniu z Androidem i klienta na komputerze, który połączy się z urządzeniem.SSLSocket zawiesza się w getInputStream, gdy urządzenie z Androidem jest w sieci bezprzewodowej

Tworzę SSLServerSocket na urządzeniu z Androidem z własnym magazynem kluczy.

final KeyStore localTrustStore = KeyStore.getInstance("BKS"); //NON-NLS 
final InputStream in = context.getResources().openRawResource(R.raw.syncapp); 
localTrustStore.load(in, "secret".toCharArray()); //Keystore pw 
in.close(); 

final SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); //NON-NLS 

final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
trustManagerFactory.init(localTrustStore); 

final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
keyManagerFactory.init(localTrustStore, "secret".toCharArray()); //privat key pw 

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 

serverSocket = sslContext.getServerSocketFactory().createServerSocket(SERVER_PORT); 
((SSLServerSocket) serverSocket).setNeedClientAuth(true); 

Następnie czekam na połączenie klienta. Gdy klient chce połączyć nowy wątek jest uruchomiony i strumienie uzyskać zażądał:

final DataInputStream input = new DataInputStream(this.clientSocket.getInputStream()); 
final DataOutputStream output = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream())); 

Najpierw użyłem tego kodu z USB tethering, aby uzyskać połączenie pomiędzy komputerem a urządzeniem z systemem Android. Więc nie było włączone Wifi/Sieć. Wszystko działało idealnie.

Następnie aktywowałem wifi na urządzeniu z Androidem i łączę się z Internetem bez Internetu. Ale teraz wywołanie metody getInputStream() zajmuje od 5 do 10 sekund. Jeśli wyłączę SSL, działa idealnie. Jeśli połączenie WLAN z Internetem jest połączone, nie ma również opóźnienia. Testowałem to z Androidem 4.2 i 5.1. Aktualizacja: Teraz mogę przetestować ten problem z systemem Android 6. I wydaje się, że problem został naprawiony ...

Uścisk dłoni jest poprawnie zakończony, ale po tym czasie na urządzeniu z Androidem może wystąpić pewne opóźnienie. (Wywołanie getInputStream pochłania ten czas). Niektórzy deweloperzy twierdzą, że zrobi to wyszukiwanie wsteczne DNS, które zakończy się przekroczeniem limitu czasu.

enter image description here

Spójrz na wychwytywanie, pierwsze połączenie zostało wykonane podczas wifi została wyłączona. Przejście danych zajęło 0,3 sekundy. Następnie po prostu aktywowałem wifi, nie łączyłem się przez wifi, nadal komunikuje się przez usb. A zajęło to ponad 5 sekund.

Znalazłem tu również problem, ale używają gniazda klienta. Potrzebuję gniazda serwera. Czy ktoś ma pojęcia, jak rozwiązać ten problem?

TLS connection using SSLSocket is slow in Android OS

+0

To nie ma żadnego sensu, aby użyć tego samego pliku zarówno magazynu kluczy i zaufanie sklepu. – EJP

+0

Czy możesz to rozwinąć? Mam plik kluczy do serwera z kluczem klucza i kluczem publicznym od klienta. Klient ma swoją własną parę kluczy i klucz publiczny z serwera. Mogą więc walidować się nawzajem, ale nikt inny nie może się z nim połączyć. – Rocket

+0

Magazyn zaufanych certyfikatów to osoba, której ufasz. To, o czym może decydować komitet, może być domyślnie obejmujące całą witrynę lub całą firmę, a nawet JDK. Magazyn kluczy zawiera własny klucz prywatny i podpisany certyfikat. To są ** sekrety **. Reżim bezpieczeństwa wokół nich jest zupełnie inny w każdym przypadku. Nie ma sensu używać tego samego fizycznego pliku dla obu. – EJP

Odpowiedz

0

Masz rację, że nie ma wstecznego DNS, że jest czas na zewnątrz. W niektórych środowiskach Java Runtime Environment, podczas uzgadniania z nieprzetworzonym adresem IP, SSLContext niepotrzebnie wykonuje wyszukiwanie adresu IP serwera. Ma to na celu sprawdzenie, czy pospolita nazwa certyfikatu serwera jest zgodna. Spróbuj użyć jednego z rozwiązań wymienionych tutaj:

How to disable Java's SSL Reverse DNS Lookup

Powiązane problemy