Intereting Posts
Преобразование рамки предварительного просмотра в растровое изображение Android: значок по умолчанию для текущего местоположения пользователя? Как протестировать обновление базы данных sqlite перед загрузкой новой версии моего приложения в игровой магазин в Android Android Сохранить объект как blob в sqlite Чтение простого текстового файла Phonegap.js отключает приложение для Android Перетаскивание не работает в библиотеке ListviewAnimation nhaarman Android – как сделать сложное приложение с вкладками с представлениями Программирование сокетов для Android без WIFi-соединения Вызывает метод libgdx SpriteBatch для начала и конца в несколько раз дороже? Генерировать имя apk как имя пакета в Android Studio Как использовать расположение координатора с фрагментом как «просмотр прокрутки» Как правильно добавлять и удалять контактные пузыри в multiautocompletetextview с помощью токенизатора пространства, такого как gmail, в поле в android Изменение цвета над прокруткой в ​​scrollview в android Постоянный магазин Cookie с использованием okhttp 2 на Android

Подписание сертификата на Android с Robospice

Я читаю о прикреплении сертификата на Android, и я смущен. Я не использую okhttp или модификацию, поэтому мне нужно сделать это вручную. Здесь есть учебник: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#Android, где они добавляют сертификат в список доверенных сертификатов. Но есть еще один учебник, когда мы проверяем base64 sha256 сертификата, установленного на сервере: https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e Какой подход является правильным? Почему мы не можем просто получить sha256 с сервера в заголовке, как это делают браузеры, и где-нибудь его хранить?

Solutions Collecting From Web of "Подписание сертификата на Android с Robospice"

Я бы рекомендовал это
https://www.paypal-engineering.com/2015/10/14/key-pinning-in-mobile-applications/

Android-метод

Самый простой способ – использовать JSEE-метод, как показано ниже. Это рекомендуемый подход для Android. Входными аргументами метода являются HTTPS-соединение и набор допустимых контактов для целевого URL.

private boolean validatePinning(HttpsURLConnection conn, Set<String> validPins) { try { Certificate[] certs = conn.getServerCertificates(); MessageDigest md = MessageDigest.getInstance("SHA-256"); for (Certificate cert : certs) { X509Certificate x509Certificate = (X509Certificate) cert; byte[] key = x509Certificate.getPublicKey().getEncoded(); md.update(key, 0, key.length); byte[] hashBytes = md.digest(); StringBuffer hexHash = new StringBuffer(); for (int i = 0; i < hashBytes.length; i++) { int k = 0xFF & hashBytes[i]; String tmp = (k<16)? "0" : ""; tmp += Integer.toHexString(0xFF & hashBytes[i]); hexHash.append(tmp); } if (validPins.contains(hexHash.toString())) { return true; } } } catch (Exception e) { e.printStackTrace(); return false; } return false; } 

Булавки объявляются как строки. Например:

Объявление ключевых контактов

 private static final Set<String> PINS = new HashSet<String>(Arrays.asList( new String[]{ "996b510ce2380da9c738...87cb13c9ec409941", "ba47e83b1ccf0939bb40d2...edf856ba892c06481a"})); 

Используя приведенный выше метод, приведен пример, показывающий, как это можно использовать. Ниже выделена только соответствующая часть.

Пример использования привязки клавиш

 protected String doInBackground(String... urls) { try { /** Test pinning given the target URL **/ /** for now use pre-defined endpoint URL instead or urls[0] **/ Log.i(LOG_TAG, "==> PinningTestTask launched."); String dest = defaultEndpoint; URL targetURL = new URL(dest); HttpsURLConnection targetConnection = (HttpsURLConnection) targetURL.openConnection(); targetConnection.connect(); if (validatePinning(targetConnection, PINS)) { final String updateText = "Key pinning succeded for: " + dest; runOnUiThread(new Runnable() { @Override public void run() { textView.setText(updateText); } }); } else { final String updateText = "Key pinning failed for: " + dest; runOnUiThread(new Runnable() { @Override public void run() { textView.setText(updateText); } }); } } catch (Exception e) { e.printStackTrace(); final String updateText = "Key pinning failed for: " + dest + "\n" + e.toString(); runOnUiThread(new Runnable() { @Override public void run() { textView.setText(updateText); } }); } return null; }