Intereting Posts
Пользовательский макет для RadioButton GCMNetworkManager не запускает PeriodicTask после перезагрузки Отключить сообщения журнала отладки Android для всех приложений Как установить фон выбранной / невыделенной кнопки в файле XML Android.database.sqlite.SQLiteDatabase.rawQuery () не обновляет столбец DATETIME с помощью функции SQLite datetime () Правильно ли зарегистрирована CameraInfo.orientation от Android? Неправильно реализовано? Убедитесь, что мой код защищен потоком Как реализовать ItemAnimator RecyclerView, чтобы отключить анимацию notifyItemChanged Развертывание на Android приводит к тому, что файл не найден после добавления элементов управления QtQuick андроид убить задачу Получить имя папки из каталога «Активы» Сохранить внутренний файл в моей собственной внутренней папке на Android Как сделать круговую прокрутку на ViewPager? Настройка серверной части для облачных сообщений Google Как запустить локальное сетевое подключение программно через точку доступа Wi-Fi на 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; }