Закрепление открытого ключа для соединения HTTPS TLS.
Существует проблема с Android API ниже 17, которая позволяет атаковать MITM (Человек посередине) в случае закрепления открытого ключа. Это было объяснено в ссылке ниже.
https://www.cigital.com/blog/inefficient-certificate-pinning-implementations/
Таким образом, в Android с минимальным пакетом SDK ниже 17, т. е. ниже версии Android 4.2, нам нужно инициализировать X509TrustManager с хранилищем ключей Android, которое имеет только корневые сертификаты сервера (вместо хранилища ключей по умолчанию, которое все сертификаты установлены на устройстве). Это помогает очищать листовые сертификаты, полученные от сервера, перед выполнением закрепления открытого ключа.
Начиная с Android API 17, Android представил X509TrustManagerExtensions, который выполняет эту очистку корня на уровне ОС.
https://developer.android.com/reference/android/net/http/X509TrustManagerExtensions.html
Мой вопрос:
Я был бы рад, если бы кто-нибудь мог привести пример того, как реализовать следующий метод, предоставленный X509TrustManagerExtensions для очистки корня.
List<X509Certificate> checkServerTrusted (X509Certificate[] chain,
String authType,
String host)
Меня смущает следующее.
host
; должен ли это быть URL-адрес домена? с https или без? или это должен быть полный URL-адрес (домен + относительный путь)Как создать момент
X509TrustManagerExtensions
? Конструктор для X509TrustManagerExtensions принимаетX509TrustManager
в качестве входных данных. Создадим ли мы этот X509TrustManager с хранилищем ключей Android по умолчанию?
Фрагмент кода (не работает):
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(KeyStore.getInstance(KeyStore.getDefaultType()));
for (TrustManager trustManager : tmf.getTrustManagers()) {
X509TrustManagerExtensions tme = new X509TrustManagerExtensions((X509TrustManager) trustManager);
tme.checkServerTrusted(chain, authType, <<String https://www.example.com>>);
}
Исключение: якорь доверия для пути сертификации не найден
Возможная угроза безопасности: использование KeyStore.getDefaultType()
Любая помощь будет принята с благодарностью.