SSL/HTTPS с Android (Nougat) и клиентскими сертификатами

Ситуация: у меня есть Рассрочка 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 или выше, какие-либо подсказки?


person Pogo    schedule 04.09.2017    source источник
comment
это должно помочь: ошибка рукопожатия ssl прервана ssl 0x618d9c18"> stackoverflow.com/questions/45984295/   -  person Navneet Krishna    schedule 04.09.2017
comment
Вы читали stackoverflow.com/questions/40363553 (комментарии и ответы)?   -  person Robert    schedule 04.09.2017