Как создать SSL-соединение с помощью установленного пользовательского сертификата на Android

Мы используем пользовательские сертификаты для аутентификации из нашего мобильного приложения на сервер F5. Мы протестировали процесс, используя тестовый сертификат, который мы установили, и создали хранилище ключей для использования при создании нашего объекта SSLContext. Для производства мы используем MDM для динамического создания и установки сертификата пользователя на устройство Android. Я считаю, что сертификат помещается в папку /data/misc/keystore. Проблема, с которой мы столкнулись, заключается в том, что мы не можем получить доступ к этому сертификату пользователя и создать с ним SSLContext.

В нашем тестировании мы убедились, что сертификат находится на устройстве, установив Open VPN для Android. Сертификат отображается в разделе «Сертификаты Android» в Open VPN, но требует, чтобы пользователь выбрал его (это не вариант для нашего приложения, нам нужно получить сертификат программно).

Все, что мы нашли, связано либо с сертификатами CA (к которым у нас есть доступ), либо с файлом .cer или .pfx, а также с установкой и созданием хранилища ключей, как мы делали с нашим тестовым сертификатом.

Есть ли способ получить доступ к установленным пользователем сертификатам для использования при создании SSLContext?

Наша версия Android — 4.1.2 (API 16).

Мы новички в разработке Android, и мы будем признательны за любые рекомендации.

Спасибо,

Майк


person Mike    schedule 07.09.2017    source источник


Ответы (2)


Чтобы получить доступ к учетным данным пользователя, хранящимся в хранилище ключей устройства, вам необходимо получить разрешение от пользователя. В частности, вам нужно вызвать один из KeyChain.choosePrivateKeyAlias() (см. документацию KeyChain). Получив псевдоним (вы получите его в KeyChainAliasCallback), вы можете использовать (из действия или службы):

PrivateKey key = KeyChain.getPrivateKey(this, alias);
X509Certificate[] chain = KeyChain.getCertificateChain(this, alias);
person Eliyahu Sandler    schedule 17.07.2019

Как насчет использования чего-то вроде:

SSLContext sslContext 
    = SSLConnections.getSSLContext(keyStoreFile, keyStoreFilePassword);
httpsURLConnection.setSSLSocketFactory(sslContext.getSocketFactory());

Также вы можете посмотреть по этой ссылке

person Paraskevas Ntsounos    schedule 01.06.2018
comment
@Майк, это то, что ты ищешь? - person Paraskevas Ntsounos; 01.06.2018