Руководство по интеграции контроллера ограничений отладки

Используйте следующие инструкции для интеграции контроллера ограничения отладки AAOS (DRC).

Рисунок 1. Пример приложения УСПД

Архитектура

Архитектура DRC проиллюстрирована ниже. Компоненты, выделенные красным (эмитент токена и дебютный контроллер ограничений), имеют сопутствующие эталонные реализации, которые вы можете настроить.

Архитектура Рисунок 2. DRC

Что такое ДРК?

Устройство автомобиля головка включает приложение DRC (см эталонную реализацию в packages/apps/Car/DebuggingRestrictionController ). Эталонное приложение включает в себя логику для получения маркера доступа от эмитента маркера, проверки маркера и последующего применения изменений ограничения отладки, как указано в маркере. Логика включает в себя базовые элементы UX на стороне автомобиля.

Что такое эмитент токена?

Это веб - сервис, вопросы криптографической подписи токенов (см эталонной реализации в packages/apps/Car/DebuggingRestrictionController/server ). Ссылка веб - сервис является развертываемой функцией Firebase Облако (чтобы узнать больше, см Облака функции для Firebase ).

Предпосылки

Перед развертыванием эталонной реализации обязательно выполните следующие задачи.

Подготовка сертификатов для подписи токенов доступа

Эмитент токенов генерирует веб-подписи JSON (JWS) в качестве токенов доступа. Для оптимальной совместимости эмитент ссылок поддерживает только алгоритм RS256 (подписи RSA с SHA256). Чтобы упростить ротацию ключей, используйте цепочку сертификатов вместо одного сертификата для подписи токенов доступа. Типичная цепочка сертификатов должна состоять из сертификата корневого ЦС, промежуточного сертификата ЦС и сертификата конечного объекта.

Сертификат конечного объекта, подписывающий токены JWS, ничем не отличается от стандартного сертификата TLS. Вы можете приобрести сертификат в общедоступных центрах сертификации, таких как DigiCert, или поддерживать собственную цепочку сертификатов, используя самозаверяющие корневые сертификаты ЦС или аппаратные модули безопасности. Сертификат конечного объекта должен быть сертификатом X509v3 с расширением альтернативного имени субъекта (SAN). Расширение SAN содержит идентификатор (например, имя хоста) эмитента токена. Наконец, сертификаты RSA должны быть предпочтительнее сертификатов EC, потому что эмитент токенов поддерживает только RS256.

Google предоставляет скрипт для создания собственных сертификатов в packages/apps/Car/DebuggingRestrictionController/server/genkey.sh .

Настройка Firebase

Ссылка Токен Эмитент использует Firebase аутентификации и Firebase Облако функции .

Чтобы настроить учетную запись Firebase:

  1. Для создания проекта Firebase см Добавить Firebase в свой Android проекта .
  2. Для того, чтобы включить некоторые аутентификаторы Firebase см Где я могу начать с Firebase аутентификацией? .
  3. Чтобы добавить пустую функцию Firebase Облака, см НАЧАТЬ .
  4. Если это еще не сделано, установите Node.js, NPM и Firebase Tools, чтобы скомпилировать и развернуть Token Issuer.

Интеграция приложения DRC

Приложение ссылки DRC находится в packages/apps/Car/DebuggingRestrictionController . Приложение может быть построено в комплекте с AOSP Soong или несвязанный с Gradle .

Сборка в комплекте

Чтобы создать связанное приложение:

  1. Скопируйте applicationId , projectId и apiKey от google-services.json в packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java . Это позволит приложению DRC правильно подключиться к Firebase.
  2. Обновление этих констант в packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java :
    • TOKEN_USES_SELF_SIGNED_CA указывает , если используются собственные сертификаты CA корневые. Если включена, то приложение доверяет DRC только PEM-закодированный сертификат корневого центра сертификации , указанный в ROOT_CA_CERT .
    • TOKEN_ISSUER_API_NAME этого имя функции Firebase Cloud и должны соответствовать функциям Cloud созданных ранее в Firebase консоли.
    • TOKEN_ISSUER_HOSTNAME должен соответствовать Subject Alternative Name в сертификате конечного объекта , который будет подписывать маркеры доступа.
    • DRC_TEST_EMAIL и DRC_TEST_PASSWORD являются учетными данными для необязательной тестовой учетной записи, которая может быть предварительно инициализирована в Firebase , если вы включили Email / Пароль вход. Они используются только для инструментальных тестов.

Теперь приложение настроено для использования вашей учетной записи Firebase и ваших сертификатов. В Android 9 и выше, вы должны установить привилегированное разрешение Allowlisting . Allowlist должен содержать по крайней мере android.permission.MANAGE_USERS . Например:

<permissions>
  <privapp-permissions package="com.android.car.debuggingrestrictioncontroller">
    <permission name="android.permission.INTERNET"/>
    <permission name="android.permission.MANAGE_USERS"/>
  </privapp-permissions>
</permissions>

Несвязанная сборка

Разделенные сборки DRC используют Gradle для компиляции приложения.

Чтобы создать разделенную сборку:

  1. Убедитесь, что вы установили Android SDK.
  2. Создайте текстовый файл с именем local.properties в корневом каталоге приложения.
  3. Установить местоположение Android SDK:
     sdk.dir=path/to/android/sdk
    
  4. Чтобы настроить Firebase, копировать google-services.json для packages/apps/Car/DebuggingRestrictionController/app . Gradle анализирует файл и автоматически настраивает остальное.
  5. Определите переменные среды. Как и в случае связанных сборок, вы должны указать:
    • $TOKEN_USES_SELF_SIGNED_CA : истина или ложь;
    • $ROOT_CA_CERT : путь к сертификату корневого ЦС PEM-закодированы;
    • $TOKEN_ISSUER_API_NAME : имя функции Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME : SAN в сертификате;
    • $DRC_TEST_EMAIL и $DRC_TEST_EMAI L: учетные данные для тестовой учетной записи, отладка строят только.
  6. Для того, чтобы построить приложение с Gradle, выполните команду:
    $ ./gradlew build
    

Интеграция эмитента токенов

Эталонный эмитент токена - это облачная функция Firebase, реализованная в Node.js. Функция может быть вызвана только аутентифицированным пользователем. Перед развертыванием приложения необходимо настроить закрытый ключ и сертификаты, используемые для подписи токенов JWS.

  1. Заполняем файл в формате JSON со следующим содержимым:
    {
        "key": "---BEGIN PRIVATE KEY---\nRSA_PRIVATE_KEY\n-----END PRIVATE KEY-----\n",
        "certificates.0": "-----BEGIN CERTIFICATE-----\nTOKEN_SIGNING_CERT\n-----END CERTIFICATE-----\n",
        "certificates.1": "-----BEGIN CERTIFICATE-----\nINTERMEDIATE_CA_CERT\n-----END CERTIFICATE-----\n",
        "certificates.2": "-----BEGIN CERTIFICATE-----\nROOT_CA_CERT\n-----END CERTIFICATE-----\n",
        "expiration": "30m",
        "issuer": "Debugging Access Token Issuer",
        "audience": "IHU"
    }
    

    Сертификаты упорядочиваются так, чтобы вначале был сертификат конечного объекта, а в конце - сертификат корневого центра сертификации. Срок действия настраивается и может быть увеличен, если выпущенному токену требуется некоторое время, прежде чем он может быть получен и использован приложением DRC. Отзыв токена не поддерживается.

  2. Загрузите конфигурацию в Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Разверните функцию Firebase Cloud:
  5. $ firebase deploy --only functions
    
  6. Для того, чтобы управлять и контролировать свой токен эмитентом см Управления развертывания функций и выполнение опций .

Установка ограничений по умолчанию

Ограничения по умолчанию могут быть применены до первой загрузки. Сделайте это с помощью статических наложений ресурсов, чтобы переопределить значения по умолчанию в платформе Android. Ограничения могут применяться соответственно к разным типам пользователей. Для того, чтобы узнать о различных типах пользователей см Поддержка нескольких пользователей .

Ограничение по умолчанию для пользователя системы без головы может быть сконфигурирован с config_defaultFirstUserRestrictions строки массива в frameworks/base/core/res/res/values/config.xml . Установка этого ограничения автоматически отключает Android Debug Bridge (ADB) до тех пор, пока ограничение не будет снято, например:

<string-array translatable="false" name="config_defaultFirstUserRestrictions">
  <item>no_debugging_features</item>
</string-array>

Ограничения по умолчанию для обычных пользователей (например, водителей и пассажиров), и гости могут быть сконфигурированы в frameworks/base/core/res/res/xml/config_user_types.xml . Вы можете наложить эти строки, чтобы установить ограничения по умолчанию для каждого типа пользователей соответственно, например:

<user-types>
  <full-type name="android.os.usertype.full.SECONDARY" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
  <full-type name="android.os.usertype.full.GUEST" >
    <default-restrictions no_debugging_features="true"/>
  </full-type>
</user-types>