Ситуация: у меня есть Рассрочка Airwatch, которая предоставляет Клиенту частные «Сертификаты пользователя», которые хранятся в личном хранилище ЦС пользователя. Сертификаты следует использовать при установлении SSL-соединения с назначенным веб-сервером https.
Например. Когда я пытаюсь получить доступ к этому веб-серверу через HTTPS и Chrome, Chrome находит сертификат клиента и спрашивает меня, хочу ли я его использовать (поэтому не напрямую). Нажав «ОК», я могу установить соединение и просмотреть сайт.
Проблема В «недавнее время» это можно было решить в пользовательских приложениях, предоставив самим приложениям физический сертификат и загрузив его во время выполнения (путем создания хранилища ключей, диспетчера доверия и пользовательского SSLContext), как описано здесь
Я, хотя с Android Nougat, я мог избавиться от «обходного пути», только настроив, где находятся сертификаты для этого приложения. Это называется настройка безопасности сети, как описано здесь https://developer.android.com/training/articles/security-config.html
Поэтому я добавил:
android:networkSecurityConfig="@xml/network_security_config"
в манифесте Android и добавил XML, который выглядит следующим образом
<network-security-config>
<base-config>
<!-- Trust ONLY the mydomain.com Domain and its Subdomains -->
<domain includeSubdomains="true">mydomain.com</domain>
<trust-anchors>
<!-- Trust preinstalled CAs -->
<certificates src="system"/>
<!-- Additionally trust user added CAs -->
<certificates src="user"/>
</trust-anchors>
</base-config>
</network-security-config>
Хотя я при использовании HttpsURLConnection автоматически использовал бы сертификаты пользователя, если это необходимо.
Текущая ситуация: я все еще получаю это:
javax.net.ssl.SSLHandshakeException: Handshake failed
Вопрос:
1) Должен ли я по-прежнему создавать собственный SSLContext и внедрять собственный Trustmanager с пользовательским хранилищем ключей? И если мне нужно это сделать, как мне получить сертификаты пользователей? ЦС системы по умолчанию можно легко инициализировать с помощью KeyStore.getInstance("AndroidCAStore");
, но как получить ключи из пользовательского хранилища, чтобы использовать их в SSLContext?
3) Я не нашел в Интернете ни одного примера использования HttpsConnection с клиентскими сертификатами, которые хранятся в хранилище ключей пользователя на Android с Nougat или выше, какие-либо подсказки?