Поскольку никто не отвечает, я постараюсь опубликовать свои мнения по этому вопросу:
Где находится файл центра сертификации?Мне нужно сгенерировать один?Нужен ли он мне?
Вам не нужно получать сертификат, подписанный 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 (или защитить мое приложение от раскрытия того, что отправляется / принимается на сервер и с сервера), например, ЭТОТ ТИП АТАКИ
Ну, пока все в порядкекак устройство принадлежит его первоначальному владельцу.Риск возникает в случае его кражи, когда вор узнает об этом прокси и может раскрыть содержание запроса / ответа.Мне больше ничего не приходит в голову, кроме того, что пользователь как можно скорее меняет свой пароль