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

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

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

Архитектура

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

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

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

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

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

Это веб-служба, которая выдает токены доступа с криптографической подписью (см. справочную реализацию в packages/apps/Car/DebuggingRestrictionController/server ). Эталонный веб-сервис представляет собой развертываемую функцию Firebase Cloud (более подробную информацию см. в разделе «Облачные функции для 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 Cloud .

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

  1. Чтобы создать проект Firebase, см. раздел «Добавление Firebase в проект Android» .
  2. Чтобы включить некоторые аутентификаторы Firebase, см. раздел С чего начать аутентификацию Firebase? .
  3. Чтобы добавить пустую функцию Firebase Cloud, см. раздел «Начало работы» .
  4. Установите инструменты Node.js , NPM и Firebase, если это еще не сделано, для компиляции и развертывания эмитента токенов.

Интегрируйте приложение 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 должно соответствовать альтернативному имени субъекта в сертификате конечного объекта, который будет подписывать токены доступа.
    • DRC_TEST_EMAIL и DRC_TEST_PASSWORD — это учетные данные для дополнительной тестовой учетной записи, которую можно предварительно предоставить в Firebase, если вы включили вход по электронной почте и паролю. Они используются только для инструментальных испытаний.

Теперь приложение настроено на использование вашей учетной записи Firebase и ваших сертификатов. В Android 9 и более поздних версиях необходимо настроить белый список привилегированных разрешений . Белый список должен содержать как минимум 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>