1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/liuzy1988-AndroidHttps

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

АндроидHTTPS

Полный пример использования двусторонней аутентификации для запроса сервера с Android

Как известно, HTTP-запрос включает адрес, порт, заголовки запроса, тело запроса и т. д. Связь с сервером осуществляется через SocketFactory, а для HTTPS-запросов используется SSLSocketFactory. Для создания SSLSocketFactory требуется два KeyStore:
один — keyStore, содержащий клиентский сертификат, который доверяет сервер, и клиентский приватный ключ;
второй — trustStore, содержащий серверный сертификат, которым доверяет клиент. По умолчанию тип KeyStore в Java — JKS, а в Android — BKS. Примеры генерации keyStore и trustStore

Метод 1 (загрузка P12 и BKS файлов, получение двух KeyStore)

// Экспортирование сертификата клиента и приватного ключа с помощью OpenSSL в формат P12
String p12File = "client.p12";
// Вам потребуется знать пароль P12
String p12Pwd = "123456";
// Создание KeyStore, используя пароль P12
KeyStore keyStore1 = KeyStoreManager.getKeyStoreByP12(ctx, p12File, p12Pwd);
// Генерация TrustStore с использованием сертификата сервера с помощью keytool
String bksFile = "client.bks";
// Вам потребуется знать пароль BKS
String bksPwd = "123456";
// Создание TrustStore
KeyStore trustStore1 = KeyStoreManager.getTrustStoreByBks(ctx, bksFile, bksPwd);

Метод 2 (загрузка client.pem, client.crt и server.crt, получение двух KeyStore)

// Создание файла вашего приватного ключа, содержимое которого начинается с BEGIN RSA PRIVATE KEY
String clientPem = "client.pem";
// Генерация сертификата клиента на основе вашего приватного ключа
String clientCrt = "client.crt";
// Установка пароля для KeyStore
```java
String keyStorePwd = "123456";
// Создание KeyStore
KeyStore keyStore2 = KeyStoreManager.getKeyStoreByCrtPem(ctx, clientCrt, clientPem, keyStorePwd);
// Сертификат сервера
String serverCrt = "server.crt";
// Создание TrustStore
KeyStore trustStore2 = KeyStoreManager.getTrustStoreByCrt(ctx, serverCrt);

Инициализация SSLSocketFactory с вашими keyStore и trustStore

Метод 1 (инициализация SSLSocketFactory для HttpsURLConnection)

// -------------Использование HTTPS-класса---------------
// Метод инициализации вызывается один раз, если вы доверяете всем серверам, передайте null вместо trustStore!
HTTPS.init(keyStore, keyStorePwd, trustStore);
// Выполнение запроса
new HTTPS().doGET(HTTPS_URL, params);

Метод 2 (инициализация SSLSocketFactory для HttpClient)

// ----------Использование класса HttpClientTool----------
```## Инициализация метода требуется всего один раз; если вы доверяете всем серверам, передайте null в качестве параметра trustStore!
```java
HttpClientTool.init(keyStore, keyStorePwd, trustStore);

Выполнение запроса

HttpClientTool.doGET(HTTPS_URL, params);
```#### Важное замечание
---
По поводу преобразования приватного ключа потребовалось несколько дней.

На сайте есть множество материалов, объясняющих использование P12 и BKS методов для создания keyStore и trustStore в Android.

В проекте я пытался прочитать `client.pem`, чтобы преобразовать его в приватный ключ PKCS8 типа, аналогичный P12.

Известно, что приватный ключ, созданный с помощью OpenSSL, имеет следующий вид, как, например, `client.pem` в проекте:
```plaintext
-----BEGIN RSA PRIVATE KEY-----

Преобразование PKCS8 с помощью OpenSSL довольно просто:

openssl pkcs8 -topk8 -inform PEM -in client.pem -outform PEM -nocrypt -out client_pkcs8.pem

После преобразования содержимое будет иметь вид:

-----BEGIN PRIVATE KEY-----

Код для выполнения вышеупомянутого преобразования действительно прост. Используйте класс PemReader из библиотеки bcprov-jdk1***.jar, чтобы прочитать pem в виде KeyPair. Затем извлеките приватный ключ из KeyPair, это и будет нашим приватным ключом!

InputStream pem = ctx.getResources().getAssets().open(pemFile);
InputStreamReader inReader = new InputStreamReader(pem);
PEMReader pemReader = new PEMReader(inReader);
KeyPair keyPair = (KeyPair) pemReader.readObject();
PrivateKey privateKey = keyPair.getPrivate();

С использованием PemWriter можно распечатать ключ, включая строки BEGIN и END:

PemObject obj = new PemObject(keyName, keyBytes);
PrintWriter pw = new PrintWriter(System.out);
PemWriter pemw = new PemWriter(pw);
pemw.writeObject(obj);
pw.close();
pemw.close();

Дополнительно

Хотите узнать больше о сертификатах? Посетите мой другой проект KS https://git.oschina.net/liuzy1988/KS

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Вот перевод текста на русский язык: Пример полного запроса сервера двусторонней аутентификации для Android. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/liuzy1988-AndroidHttps.git
git@api.gitlife.ru:oschina-mirror/liuzy1988-AndroidHttps.git
oschina-mirror
liuzy1988-AndroidHttps
liuzy1988-AndroidHttps
master