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.
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
To nie ma żadnego sensu, aby użyć tego samego pliku zarówno magazynu kluczy i zaufanie sklepu. – EJP
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
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