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

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

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

Архитектура

Архитектура 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 Cloud, см. раздел Начало работы .
  4. Установите Node.js, NPM и Firebase Tools, если это еще не сделано, чтобы скомпилировать и развернуть эмитент токена.

Интеграция приложения 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, которое должно совпадать с облачной функцией, которую вы создали ранее в консоли 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 : путь к корневому сертификату CA в кодировке 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>