Как добавить SSL-сертификат в проект Android? - PullRequest
0 голосов
/ 07 мая 2018

Я очень мало знаю о связи между клиентом и сервером и еще меньше о SSL, но я являюсь частью проекта, в котором я разрабатываю приложение для Android, которое читает данные на сервере. Я обычно открывал сокет без какой-либо защиты на сервере, но мы решили защитить сервер с помощью SSL. Парень, который сделал это, прислал мне файл .crt, который является открытым ключом, и файл склада доверенных сертификатов в формате .jks.

Меня попросили добавить этот сертификат в проект Android. Но я не могу найти, как это сделать. Вот почему я был бы очень признателен, если бы кто-нибудь сказал мне, как добавить сертификат в проект Android для открытия SSLSocket.

Спасибо

1 Ответ

0 голосов
/ 07 мая 2018

У Google есть специальное руководство для таких случаев, как ваш.

Вот небольшая цитата о том, что вам нужно:

Неизвестный центр сертификации В этом случае возникает исключение SSLHandshakeException, поскольку у вас есть центр сертификации, которому система не доверяет. Это может быть связано с тем, что у вас есть сертификат от нового ЦС, которому Android еще не доверяет, или ваше приложение работает в более старой версии без ЦС. Чаще всего CA является неизвестным, потому что это не публичный CA, а частный, выданный организацией, такой как правительство, корпорация или образовательное учреждение, для собственного использования.

К счастью, вы можете научить HttpsURLConnection доверять определенному набору CA. Процедура может быть немного запутанной, поэтому ниже приведен пример, который берет определенный CA из InputStream, использует его для создания KeyStore, который затем используется для создания и инициализации TrustManager. TrustManager - это то, что система использует для проверки сертификатов с сервера, и, создав один из хранилища ключей с одним или несколькими центрами сертификации, они будут единственными центрами сертификации, которым доверяет этот TrustManager.

Учитывая новый TrustManager, пример инициализирует новый SSLContext, который предоставляет SSLSocketFactory, который можно использовать для переопределения стандартного SSLSocketFactory из HttpsURLConnection. Таким образом, соединение будет использовать ваши CA для проверки сертификата.

Вот полный пример использования организационного центра сертификации из Университета Вашингтона:

// Load CAs from an InputStream
// (could be from a resource or ByteArrayInputStream or ...)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
// From https://www.washington.edu/itconnect/security/ca/load-der.crt
InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));
Certificate ca;
try {
    ca = cf.generateCertificate(caInput);
    System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
    caInput.close();
}

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);

// Tell the URLConnection to use a SocketFactory from our SSLContext
URL url = new URL("https://certs.cac.washington.edu/CAtest/");
HttpsURLConnection urlConnection =
    (HttpsURLConnection)url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());
InputStream in = urlConnection.getInputStream();
copyInputStreamToOutputStream(in, System.out);

Так что просто поместите ваш файл crt в папку ресурсов, а затем запустите этот код, изменив caInput на:

InputStream caInput = getResources().openRawResource(R.raw.cert);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...