SSL / TLS соединение с Android на пользовательский сокет-сервер - PullRequest
1 голос
/ 22 сентября 2019

Закончено кодирование простого сервера чата на эрланге, который использует gen_tcp (простые сокеты) и приложение Android Client для ТЕСТИРОВАНИЯ.

Теперь мне нужно реализовать SSL / TLS.

Я сохранил соединение(Отправка и получение данных) часть в одном модуле, несколько строк кода, которые я могу легко обновить.

У меня нет предыдущего опыта внедрения SSL / TLS, поэтому я запутался здесь (как и многие другие).

Вопросы - Часть для тестирования (localhost):

Я могу создать самозаверяющий сертификат по:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

, что приводит к двум файлам, key.pem и cert.pem , Насколько я понимаю, один является сертификатом сервера, а другой является файлом ключа, но

  1. Где находится файл центра сертификации?Мне нужно сгенерировать один?Нужен ли он мне?
  2. Достаточно ли их для тестирования моего приложения, чтобы подготовить его к выпуску?
  3. Как превратить мою простую Android-розетку в безопасную?(предпочтительно kotlin)
  4. Могу ли я доверять своему самозаверяющему сертификату программно (и только этому) или мне нужно установить его на моем устройстве (и любом другом устройстве, например, на устройстве друга)

Вопросы - Производственная часть:

СЛЕДУЕТ ли мне использовать самозаверяющий сертификат на моем сервере?Нужно ли создавать ЦС?Плюсы и минусы использования самоподписанного сертификата?

Могу ли я использовать бесплатные сертификаты, такие как letsencrypt навсегда?Плюсы и минусы?

Наконец:

  1. Мне тоже нужен сертификат для Клиента?Нужно ли предоставлять какой-то ключ [ы] для приложения Android?

  2. Что я могу сделать, чтобы защитить свое приложение от MITM (или защитить мое приложение от раскрытия того, что отправляется /например, ЭТОТ ТИП АТАКИ

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Поскольку никто не отвечает, я постараюсь опубликовать свои мнения по этому вопросу:

Где находится файл центра сертификации?Мне нужно сгенерировать один?Нужен ли он мне?

Вам не нужно получать сертификат, подписанный CA, если ваш сервер Android (или любой другой) будет использоваться только вашим сервером.,Серверный сертификат используется сервером для подтверждения своей идентичности (т. Е. Чтобы доказать, что это действительно тот, кем он притворяется) клиентам, например веб-браузерам.Поэтому, пока ваш клиент подключается к тому же хосту (сертификат, которым он обладает заранее), вам не нужны никакие подписи (ни СА, ни самоподписанные)

Достаточно ли их для тестированиямое приложение, чтобы подготовить его к выпуску?

Поскольку вы использовали самый безопасный RSA (4096 бит), я не вижу никаких других улучшений, которые можно было бы сделать с сертификатом, который высгенерировано, так что да, вы можете считать его готовым к выпуску

Как превратить мой простой Android-сокет в безопасный сокет?(предпочтительно kotlin)

Я никогда не использовал Kotlin, но в среде Java это так просто, как:

import javax.net.ssl.*;
import java.security.*;

SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket)factory.createSocket("host", port);

Могу ли я доверять своему самозаверяющему сертификату программно(и только этот) или мне нужно установить его на моем устройстве (и любом другом устройстве, например на устройстве друга)

Вы можете добавить cert.pem в файл хранилища ключей (при условии, что тип хранилищаJKS и пароль: passw):

keytool -importcert -file cert.pem -keystore keystore.jks -storetype JKS -alias "alias" -storepass passw

, а затем поместите keystore.jks в папку raw вашего приложения, сделав его доступным как R.raw.keystore из вашего кода:

    KeyStore trusted = KeyStore.getInstance("JKS");
    InputStream in = context.getResources().openRawResource(R.raw.keystore); //open inputstream for keystore file in "raw" folder
    trusted.load(in, "passw".toCharArray());                                 //load the keystore from file (using password specified when certificate was imported into keystore)       
    in.close();                                                              //close inputstream 
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(trusted, "passw".toCharArray());
    SSLContext sslContext = SSLContext.getInstance("TLSv1.2");               //configure SSL Context to use TLS v1.2 
    sslContext.init(kmf.getKeyManagers(),null,null);
    SSLSocketFactory factory = sslContext.getSocketFactory();

и затем вы используете factory описанным выше способом для открытия безопасных сокетов

СЛЕДУЕТ ли мне использовать свой самозаверяющий сертификат на моем сервере?Нужно ли создавать ЦС?Плюсы и минусы использования самозаверяющего сертификата?

См. Ответ 1

Могу ли я использовать бесплатные сертификаты, такие как letsencrypt навсегда?Плюсы и минусы?

Все зависит от того, насколько велик риск компрометации конкретного ЦС, т. Е. Подписания мошеннического сертификата.Всегда лучше использовать надежный центр сертификации, хотя по более высокой цене

Нужен ли мне сертификат для клиента тоже?Нужно ли предоставлять какой-то ключ [ы] для приложения Android?

Сертификат клиента - это еще один способ аутентификации конечного пользователя.Если вы уже используете пароль для аутентификации, вам не нужно использовать сертификат клиента (вы можете добавить его для дополнительной безопасности, но в большинстве случаев это не нужно, кроме того, кто-то может его украсть)

Что я могу сделать, чтобы защитить мое приложение от MITM (или защитить мое приложение от раскрытия того, что отправляется / принимается на сервер и с сервера), например, ЭТОТ ТИП АТАКИ

Ну, пока все в порядкекак устройство принадлежит его первоначальному владельцу.Риск возникает в случае его кражи, когда вор узнает об этом прокси и может раскрыть содержание запроса / ответа.Мне больше ничего не приходит в голову, кроме того, что пользователь как можно скорее меняет свой пароль

0 голосов
/ 27 сентября 2019

Принятый ответ является хорошим, но неполным.

Где находится файл центра сертификации?Мне нужно сгенерировать один?Нужен ли он мне?

Это часть инфраструктуры открытых ключей.Здесь интересно слово «public»: если ваш сервер не будет использоваться кем-либо, кроме вас, то нет смысла платить за сторонний сертификат CA.Они предназначены для доменов, которые развернуты для огромного числа публичных пользователей и, следовательно, подвержены атакам и уязвимостям.

СЛЕДУЕТ ли мне использовать самозаверяющий сертификат на моем сервере?Нужно ли создавать ЦС?Плюсы и минусы использования самозаверяющего сертификата?

Теперь вот что придумали: если вы используете сторонний сертификат CA, он будет стоить денег, но к нему могут получить открытый доступ с мобильных устройств и браузеровпрямо из коробки, т. е. фабрика сокетов SSL по умолчанию сможет подключаться к вашему домену.

Если вы выберете самозаверяющий сертификат, мобильное устройство или браузер не сможет выполнить рукопожатие SSL (то есть не сможетподключиться) к вашему домену без одного из следующих изменений:

  • дать указание фабрике сокетов игнорировать проверку SSL .
  • создать фабрику сокетов, которая распознает ваш сертификат
  • добавьте созданный вами самозаверяющий сертификат в список известных сертификатов на вашем клиентском устройстве (мобильный / настольный браузер).
  • используйте метод под названием SSL-пиннинг для проверки рукопожатий и соединений.

Нужен ли мне сертификат для Клиента?Нужно ли предоставлять какой-то ключ [ы] для приложения Android?

То, о чем вы говорите, называется двунаправленной или двусторонней проверкой SSL .Это хорошо, но необязательно.Необходимо и достаточно иметь общедоступный сертификат CA на вашем сервере.

Как превратить мой простой Android-сокет в безопасный сокет?

Сокет по умолчаниюЭто безопасный сокет, по крайней мере, с любой разумной библиотекой TCP / HTTP.Вы должны внести изменения в код и указать фабрику сокетов, чтобы игнорировать проверку SSL.

Достаточно ли этого, чтобы протестировать мое приложение и подготовить его к выпуску?

Ну, это немного неясно.Вы должны тестировать, используя закрепление SSL или известный сертификат CA, а не самозаверяющий сертификат.Если вы хотите проверить только функциональность вашего приложения, вы можете отключить проверку SSL.И приложение релиза, насколько я понимаю, потребует фабрики сокетов по умолчанию (т.е. защищенной), которая автоматически управляет рукопожатиями SSL с признанным сторонним сертификатом CA.

Могу ли я доверять своему самозаверяющему сертификатупрограммно (и только этот) или мне нужно установить его на моем устройстве (и любом другом устройстве, например, на устройстве друга)

Да, его можно установить на клиентском устройстве / браузере.Но с вашим сервером можно обмениваться данными только через это устройство / браузер.

Последняя точка :

Если вы публикуете приложение в Play Store с самозаверяющей подписьюсертификатом или если проверка SSL отключена или проигнорирована, вы вскоре получите электронное письмо с предупреждением о том, что ваше приложение будет закрыто.Удачи.

...