Как создать безопасное SSL-соединение между клиентом Android и сервером Java? - PullRequest
3 голосов
/ 28 августа 2011

Я пытаюсь создать безопасное соединение TCP / IP между моим клиентом Android и сервером Java.Криптография далеко не моя сильная сторона.Я знаю, что должен использовать хранилища ключей Bouncy Castle, но я застрял.

Мне нужно создать самоподписанный сертификат, который я могу использовать с сервером и клиентом.Вот где я застрял.

         InputStream clientTruststoreIs = getResources().openRawResource(R.raw.bks);
         KeyStore trustStore = null;
         trustStore = KeyStore.getInstance("BKS");
         trustStore.load(clientTruststoreIs, "123456".toCharArray());
        InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();

        sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, 2222);
        inputStream =  sslSocket.getInputStream();  
        Log.d("TEST", "\n1 input");

Соединяется нормально, показывает соединение на стороне сервера, однако линия inputStream = sslSocket.getInputStream() полностью блокируется / не возвращается.Я не уверен, правильно ли я настроил какой-либо из надувных замков или сервер настроен правильно.Пожалуйста, помогите, я нахожусь в тупике ....

Редактировать: я изменил сервер так, чтобы он отправлял данные при соединении и все еще ничего, и я изменил порядок, где я получаю свой ввод ивыходные потоки, а затем он заблокирован там, где я получал выходной поток:

        sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, 9999);
        outputStream = sslSocket.getOutputStream();
        Log.d("test", "--**--- created socket 2.0 outputsreams"); // does not reach here
        outputStreamWriter = new OutputStreamWriter(outputStream);
        bufferedWriter = new  BufferedWriter(outputStreamWriter);         
        inputStream =  sslSocket.getInputStream();  
        inputStreamReader = new InputStreamReader(inputStream);
        bufferedReader = new BufferedReader(inputStreamReader);
        ...
        String line = bufferedReader.readLine(); // where I'd expect it to lock...

Так что все равно нет ни удачи, ни таймаута, ни исключения, он просто ждет там ...

Ответы [ 3 ]

3 голосов
/ 28 августа 2011

Я думаю, что ваша проблема похожа на это . Тот же рабочий процесс выполняется для соединений сокетов SSL:

Однако основы почти такие же, как в этой программе:

Откройте сокет.

Открыть входной поток и выходной поток в сокет.

Чтение и запись в поток в соответствии с протоколом сервера, вызовите flush () в потоке, когда вы закончите с сообщением.

Закрыть потоки.

Закройте розетку.

Итак, вы должны

  1. Сначала отправьте запрос на сервер, написав в OutputStream сервера со стороны клиента, flush, когда вы закончите.
  2. Затем сервер получит сообщение через свой InputStream и может в ответ записать его в OutputStream, снова сбросив его после завершения.
  3. Считайте ответ со стороны клиента, используя InputStream, начните с 1. до тех пор, пока вы не закончите.

Наконец, вы должны закрыть все потоки.

Очистка и отправка запроса перед попыткой прочитать ответ на стороне клиента должны остановить «зависание».


Редактировать: Вы уверены, что используете SSLServerSocketFactory на сервере? Похоже, вы пытаетесь использовать SSLSocketFactory для клиента и сервера. Это не сработает. Я прогуглил этот урок , это в основном похоже на то, как должен выглядеть ваш код.

1 голос
/ 28 августа 2011

Вместо этого вы можете попробовать класс org.apache.http.conn.ssl.SSLSocketFactory, в частности этот конструктор .

РЕДАКТИРОВАТЬ 26 марта 2017 г .:

Игнорируйте то, что я написал выше, этот класс устарел как часть устаревшего HTTP-клиента Apache на Android. Вместо этого Android поддерживает и улучшает стандартные классы HttpURLConnection и HttpsURLConnection. См. это для полного объяснения .

0 голосов
/ 28 августа 2011

Не уверен, что ваш код соответствует назначению. Но линия


    inputStream =  sslSocket.getInputStream();  

в основном ожидает ответа от сервера от сокета. В большинстве случаев, если вы сначала не запросите что-либо (записав в выходной поток сокета), запрос ответа просто заблокирует сокет и будет ждать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...