список сертификатов, хранящихся в учетных данных пользователя

В Android 7 Nougat установленный пользователем сертификат переходит в «Учетные данные пользователя» вместо «Доверенные учетные данные» (который состоит из учетных данных системы и учетных данных пользователя).

Я использовал для доступа к «Надежным учетным данным»:

KeyStore keystore = KeyStore.getInstance("AndroidCAStore");

с помощью приведенного выше кода я могу получить доступ к системным и доверенным учетным данным пользователя.

Но теперь, в Android 7, установленный пользователем сертификат находится в отдельном месте под названием «Учетные данные пользователя» в разделе Settings --> Security --> User credentials.

Мой вопрос: как я могу программно перечислить учетные данные внутри User credentials в Android 7?


person Mellon    schedule 01.11.2016    source источник
comment
Читая документы, я бы предположил, что приложение имеет неявный доступ к сертификатам пользователя, если оно настроено с помощью ‹trust-anchors› (как это делается автоматически для приложений для AP23 и ниже). Я ничего не читал о том, что есть способ явного доступа к хранилищу учетных данных пользователя.   -  person Robert    schedule 01.11.2016
comment
Я добавил <certificates src="user"/> в <trust-anchors>, однако мое приложение по-прежнему не доверяет моему сертификату, расположенному в разделе «Учетные данные пользователя».   -  person Mellon    schedule 03.11.2016
comment
Я думаю, вы могли неправильно понять Settings-->Security-->User credentials. Он показывает сертификат и закрытые ключи, установленные пользователем, а не доверенные сертификаты. Android6 может управлять пользовательскими сертификатами, но вы не видите их в настройках, только корневые центры сертификации. При установке PKCS#12 закрытый ключ доступен в KeyChain, а корневой ЦС может быть установлен как доверенные учетные данные пользователя в AndroidCAStore. AndroidCAStore содержит пользовательские и системные записи, и это то, что вы видите в Android 6 и 7. Если вы ищете способ перечислить закрытые ключи (содержимое учетных данных пользователя), API не существует.   -  person pedrofb    schedule 17.11.2016
comment
@pedrofb, нет, я не ошибаюсь, например. в Android 6, когда я устанавливаю свой сертификат и закрытый ключ, он переходит к Settings ---> Security-->Trusted credentials(Users tab), но в Android 7 он переходит к Settings --> Security-->User credentials, которому не доверяют. Мой вопрос: как я могу узнать, что в Android 7 мой сертификат установлен в Settings-->Security-->User credential? Мой сертификат НЕ МОЖЕТ быть указан в AndroidCAStore, я пробовал. AndroidCAStore перечисляет только доверенные записи.   -  person Mellon    schedule 17.11.2016
comment
Я проверил это с реальным сертификатом как 6, так и 7. В андроиде 6 промежуточные сертификаты и корневой ЦС установлены в AndroidCAStore (не в листе), а в андроиде 7 - нет. Вы видите сертификат, установленный в Settings-->Security-->User credential, но корневой ЦС не установлен в AndroidCAStore. Вы должны установить его вручную. Я экспортировал общедоступный сертификат как .cer из .pfx и установил, а затем отображается   -  person pedrofb    schedule 17.11.2016
comment
Вы используете самоподписанный сертификат?   -  person pedrofb    schedule 17.11.2016
comment
@pedrofb, я использую самозаверяющий сертификат. То, что вы нашли, точно такое же, как и то, что нашел я. Я не уверен, почему мы обсуждаем это, которое мы оба понимаем одинаково. Мой вопрос заключается в том, как программно проверить, установлен ли мой самозаверяющий сертификат в Settings-->Security-->User credentials. Кажется, для этого нет официального API. Вот почему я публикую этот вопрос.   -  person Mellon    schedule 18.11.2016
comment
Я запутался с разницей между 6 и 7. А вот с самоподписанным сертификатом теперь разбираюсь. При установке p12 в 7 корневой ЦС (сам сертификат) не устанавливается как доверенный, как в 6   -  person pedrofb    schedule 18.11.2016
comment
@pedrofb, да, давайте посмотрим, может ли кто-нибудь предложить обходной путь или решение для программного доступа к Settings-->Security-->User credentials.   -  person Mellon    schedule 18.11.2016


Ответы (2)


Чтобы обеспечить более последовательную и безопасную работу в экосистеме Android, начиная с Android Nougat, совместимые устройства доверяют только стандартизированной системе, CAs поддерживаемой в AOSP.

Ранее набор pre-installed CAs в комплекте с системой мог варьироваться от устройства к устройству. Это могло привести к проблемам совместимости, если на некоторых устройствах не было ЦС, необходимых приложениям для подключения, а также к потенциальным проблемам безопасности, если ЦС, не отвечающим нашим требованиям безопасности, были включены на некоторые устройства.

Во-первых, убедитесь, что ваш ЦС должен быть включен в систему. Предустановленные центры сертификации предназначены только для тех центров сертификации, которые соответствуют нашим требованиям безопасности, поскольку они влияют на безопасные соединения большинства приложений на устройстве. Если вам нужно добавить ЦС для подключения к хостам, которые используют этот ЦС, вам следует вместо этого настроить свои приложения и службы, которые подключаются к этим хостам. Для получения дополнительной информации об настройке доверенных центров сертификации.

По приведенной выше ссылке вы можете найти все необходимая информация для доверительных пользовательских центров сертификации с различными потребностями, такими как

  1. Доверие кастомным центрам сертификации для отладки
  2. Доверие кастомным центрам сертификации для домена
  3. Доверие ЦС, добавленным пользователями, для некоторых доменов
  4. Доверие ЦС, добавленным пользователем, для всех доменов, кроме некоторых
  5. Доверие добавленным пользователем центрам сертификации для всех безопасных соединений

Итак, в основном вам нужно добавить файл конфигурации безопасности и Настройка пользовательского центра сертификации (для Android 7.0 (уровень API 24) ) и выше).

В вашем manifest.xml

<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

В res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

Просто для информации:- Если вы используете ЦС, который, по вашему мнению, должен быть включен в Android, сначала заполните Процесс включения Mozilla CA, а затем заполните запрос функции для Android, чтобы ЦС был добавлен в стандартизированный набор системных ЦС.

Дайте мне знать для любой дальнейшей помощи.

Надеюсь, что это поможет вам. Продолжай кодить!!!

person Pravin Divraniya    schedule 22.11.2016
comment
Два вопроса: 1. для моего приложения мне нужно установить собственный корневой сертификат, чтобы доверять хранилищу в Android 7. Вы говорите, что процесс включения Mozilla CA является обязательным процессом, чтобы мой корневой сертификат был доверенным для Android 7? - person Mellon; 25.11.2016
comment
2. Что такое <domain includeSubdomains="true">example.com</domain>, это надо ставить? Что это за субдомен? Я имею в виду, что знаю, что у меня есть корневой сертификат, который нужно установить для доверенного хранилища, но где мне взять субдомен? - person Mellon; 25.11.2016
comment
1) Процесс включения Mozilla CA не является обязательным, он просто необходим, если вы хотите, чтобы ваш CA был в списке доверенных учетных данных в Android 7.0 и выше. - person Pravin Divraniya; 25.11.2016
comment
2) Это ваш домен и поддомены, к которым вы хотите установить безопасное соединение. Если вы хотите, чтобы ваш пользовательский ЦС доверял всем доменам, отметьте № 5 «Доверять добавленным пользователями ЦС для всех безопасных подключений» по этой ссылке. android-developers.blogspot.in/ 2016/07/ - person Pravin Divraniya; 25.11.2016
comment
Я все еще хочу спросить о процессе включения Mozilla CA. Итак, как вы сказали, это просто необходимо, если вы хотите, чтобы ваш ЦС был в списке доверенных учетных данных в Android 7.0 и выше, в списке доверенных учетных данных есть два подсписка: список доверенных систем и список доверенных пользователей, для этого списка требуется включение ЦС Mozilla. процесс? Оба? Я думаю, мне нужно, чтобы мой ЦС был установлен в Настройки-->Безопасность--> доверенные учетные данные (вкладка «Пользователи»), я имею в виду список доверенных пользователей. - person Mellon; 25.11.2016
comment
Согласно документации процесс включения ЦС Mozilla требуется для добавления ЦС в стандартизированный набор системных ЦС, поэтому он будет для «доверенного» списка. Для списка «Доверенный пользователь», я думаю, когда вы добавляете свой сертификат в «network_security_config», вы можете увидеть его в «Доверенном пользователю» (я не проверял). - person Pravin Divraniya; 25.11.2016
comment
Давайте продолжим это обсуждение в чате. - person Pravin Divraniya; 25.11.2016

Помимо изменения способа настройки ответа Ca (@Pravin D), Android изменил способ загрузки сертификата pkcs12 с 6 на 7. Я выделяю важные элементы:

При импорте pkcs12 корневой ЦС импортируется как доверенный?

  • Андроид 6: Да
  • Андроид 7: нет

Где я могу увидеть надежные учетные данные?

  • Android 6: Settings ---> Security-->Trusted credentials (система и пользователь)
  • Android 7: Settings ---> Security-->Trusted credentials (вкладка «Система и пользователь»)

Как установить учетные данные пользователя?

  • Android 6: файл pkcs#12, файл сертификата, программно
  • Android 7: файл pkcs # 12 (без закрытых ключей), файл сертификата, программно, пользовательская конфигурация CA (ответ @ Pravin D)

Где я могу увидеть учетные данные пользователя (закрытые ключи)?

  • Android 6: недоступно в настройках
  • Андроид 7: Settings-->Security-->User credentials

Можно ли составить список учетных данных пользователя программным способом?

  • Андроид 6: нет
  • Андроид 7: нет

При подробном рассмотрении кода Android внутреннее хранилище ключей Android умышленно скрыто и доступно для использования только из основных классов Android. Невозможно реализовать обходной путь для вывода учетных данных пользователя.

person pedrofb    schedule 14.12.2016
comment
Как насчет установки pkcs # 12 в Android 7 с закрытым ключом? Как установить такой сертификат программно? - person Mellon; 06.04.2017