Добавление пользовательского сертификата в AndroidCaStore для Wi-Fi и HTTPS - PullRequest
0 голосов
/ 20 мая 2019

У меня есть приложение для центральной системы, которое позволяет пользователю устанавливать ЦС, которые могут использоваться для подключения HTTPS или Wi-Fi Enterprise.Это приложение может рассматриваться как менеджер сертификатов, который будет обслуживать несколько приложений.(Хотя это и другие вещи, в основном конфигурация)

Я работаю на Android Pie, и я впервые работаю на Android, так что извините за нелюбовь.

Основано на отличном обсуждении вссылки ниже, включая замечательный блог Николая

Центральное хранилище Android https://nelenkov.blogspot.com/2011/12/ics-trust-store-implementation.html Программно добавить центр сертификации, сохраняя сертификаты SSL системы Android

Я пытаюсь:

1) Сделать мое приложение владельцем устройства, а затем использовать диспетчер политик устройств для установки сертификата
Я сделал это (скопируйте правила в makefile моей платы)

упаковка device_policies.xml в / data / system /
упаковка device_owner.xml в / data / system /
Изменение AndroidManifest.xml и реализация класса администратора устройства

2) Добавьте сертификаты в центральный AndroidCaStore с помощью Keystore APis
. Для этого я

Считываю сертификаты из файла
Получить keystorЭкземпляр "AndroidCStore"
setCertificate ()

**Code snippet For (1)**  

DevicePolicyManager dpm = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComp = new ComponentName(context, ConfigSettingsAdminReceiver.class);

if (dpm.isAdminActive(adminComp))
{
    String CERT_FILE_1 = "/data/sam/ca1.crt";
    FileInputStream cert1 = new FileInputStream(CERT_FILE_1);

    byte [] cert1_contents = new byte[(int)cert1.available()];
    cert1.read(cert1_contents);

    if (dpm.installCaCert(adminComp, cert1_contents))
    {
        Plog.d("installCustCertificate | SAM |  Installed custom cert 1");
    }
    else
    {
        Plog.e("installCustCertificate | SAM |  FAIL Cert 1");
    }
}

**Code snippet For (2)**  

KeyStore keyStoreAndroid = KeyStore.getInstance("AndroidCAStore");
InputStream fis          = new BufferedInputStream(inputStream);
CertificateFactory cf    = CertificateFactory.getInstance("X.509");
Certificate cert;

keyStoreAndroid.load(null, null);

try{
    cert = cf.generateCertificate(fis);
    keyStoreAndroid.setCertificateEntry("custcert", cert);
} finally {
    cf.close();
}

Для (1) выше,
Я не могу установить свое приложение в качестве владельца устройства,Я мог бы сделать это администратором устройства при загрузке.
Однако я при вызове installCaCert () API-интерфейса DevicePolicyManager получаю сообщение об ошибке:
AdminComponentInfo {com.sam.configsettings / com.sam.configsettings.ConfigSettingsAdminReceiver} не владеет профилем

При проверке / data / system я вижу, что device_policies.xml присутствует, но нет никаких признаков device_owner.xml

For (2) выше,
Я получаю сообщение об ошибке "исключение: java.lang.UnsupportedOperationException"

Есть идеи, чего мне не хватает?

...