Przewodnik po integracji kontrolera ograniczeń debugowania

Aby zintegrować kontroler ograniczeń debugowania AAOS (DRC), wykonaj instrukcje podane na tej stronie.

Rysunek 1. Przykład aplikacji DRC

Architektura

Architekturę DRC przedstawia rysunek 2. Komponenty zaznaczone na czerwono (wydawca tokena i DRC) mają implementacje referencyjne, które możesz dostosować.

Rysunek 2. Architektura DRC.

Co to jest DRC?

Główna jednostka sterująca samochodu zawiera aplikację DRC (patrz implementacja referencyjna w packages/apps/Car/DebuggingRestrictionController). Aplikacja referencyjna zawiera logikę umożliwiającą otrzymanie tokena dostępu od jego wystawcy, jego weryfikację, a następnie zastosowanie zmian ograniczeń debugowania zgodnie z tokenem. Logika obejmuje podstawowe elementy UX po stronie samochodu.

Co to jest wydawca tokena?

Jest to usługa internetowa, która wydaje tokeny dostępu z podpisem kryptograficznym (zobacz implementację referencyjną w packages/apps/Car/DebuggingRestrictionController/server). Usługa internetowa referencyjna to funkcja w Cloud Functions dla Firebase, którą można wdrożyć (więcej informacji znajdziesz w artykule Cloud Functions dla Firebase).

Wymagania wstępne

Zanim wdrożysz implementację referencyjną, wykonaj te czynności.

Przygotuj certyfikaty do podpisywania tokenów dostępu

Wydawca tokena generuje podpisy JWS (JSON Web Signature) jako tokeny dostępu. Ze względu na optymalną zgodność wydawca referencyjny obsługuje tylko algorytm RS256 (podpisy RSA z SHA256). Aby ułatwić rotację kluczy, do podpisywania tokenów dostępu użyj łańcucha certyfikatów zamiast pojedynczego certyfikatu. Typowy łańcuch certyfikatów powinien składać się z certyfikatu głównego urzędu certyfikacji, pośredniego certyfikatu urzędu certyfikacji i certyfikatu jednostki końcowej.

Certyfikat jednostki końcowej podpisujący tokeny JWS nie różni się niczym od standardowego certyfikatu TLS. Możesz kupić certyfikat w publicznych urzędach certyfikacji, takich jak DigiCert, lub utrzymać własny łańcuch certyfikatów za pomocą podpisanych samodzielnie certyfikatów głównych urzędu certyfikacji lub modułów zabezpieczeń sprzętowych. Certyfikat jednostki końcowej powinien być certyfikatem X509v3 z rozszerzeniem Subject Alternative Name (SAN). Rozszerzenie SAN zawiera identyfikator (np. nazwę hosta) wystawcy tokena. Na koniec należy pamiętać, że certyfikaty RSA są lepsze niż certyfikaty EC, ponieważ wystawca tokena obsługuje tylko RS256.

Google udostępnia skrypt powłoki do generowania certyfikatów podpisanych samodzielnie w packages/apps/Car/DebuggingRestrictionController/server/genkey.sh.

Konfigurowanie Firebase

Wystawca tokena referencyjnego korzysta z Uwierzytelniania Firebasefunkcji Cloud Functions Firebase.

Aby skonfigurować konto Firebase:

  1. Aby utworzyć projekt Firebase, zapoznaj się z artykułem Dodawanie Firebase do projektu na Androida.
  2. Aby włączyć niektóre uwierzytelniacze Firebase, przeczytaj artykuł Gdzie zacząć korzystać z usługi Uwierzytelnianie Firebase?.
  3. Aby dodać pustą funkcję Firebase Cloud, zapoznaj się z artykułem Pierwsze kroki.
  4. Zainstaluj narzędzia Node.js, NPM i Firebase, aby skompilować i wdrożyć wystawcę tokenów.

Integracja aplikacji DRC

Aplikacja DRC referencyjna znajduje się w packages/apps/Car/DebuggingRestrictionController. Aplikację można skompilować razem z AOSP za pomocą Soong lub osobno za pomocą Gradle.

Kompilacja połączona

Aby utworzyć pakiet aplikacji:

  1. Skopiuj applicationId, projectId i apiKey z google-services.json do packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java. Dzięki temu aplikacja DRC może prawidłowo połączyć się z Firebase.
  2. Zaktualizuj te stałe w pliku packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java:
    • TOKEN_USES_SELF_SIGNED_CA wskazuje, czy używane są samodzielnie podpisane certyfikaty urzędu certyfikacji głównej. Jeśli ta opcja jest włączona, aplikacja DRC ufa tylko certyfikatowi głównego urzędu certyfikacji zakodowanemu w formacie PEM, który jest określony w pliku ROOT_CA_CERT.
    • TOKEN_ISSUER_API_NAME to nazwa funkcji Firebase Cloud, która powinna odpowiadać funkcji utworzonej wcześniej w konsoli Firebase.
    • TOKEN_ISSUER_HOSTNAME musi być zgodna z nazwą alternatywną podmiotu w certyfikacie podmiotu końcowego, który będzie podpisywać tokeny dostępu.
    • DRC_TEST_EMAILDRC_TEST_PASSWORD to dane logowania do opcjonalnego konta testowego, które można wstępnie skonfigurować w Firebase, jeśli masz włączone logowanie za pomocą adresu e-mail i hasła. Służy on tylko do testów z instrumentacją.

Aplikacja jest teraz skonfigurowana do korzystania z Twojego konta Firebase i certyfikatów. W Androidzie 9 i wyższych musisz skonfigurować listę zezwoleń uprzywilejowanych. Lista dozwolonych musi zawierać co najmniej android.permission.MANAGE_USERS. Przykład:

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

Niespakowana kompilacja

Kompilacja aplikacji w niespakowanym pakiecie DRC korzysta z Gradle.

Aby utworzyć niespakowaną wersję:

  1. Sprawdź, czy masz zainstalowany pakiet SDK do Androida.
  2. W katalogu głównym aplikacji utwórz plik tekstowy o nazwie local.properties.
  3. Ustaw lokalizację pakietu Android SDK:
     sdk.dir=path/to/android/sdk
  4. Aby skonfigurować Firebase, skopiuj google-services.json do packages/apps/Car/DebuggingRestrictionController/app. Gradle przeanalizuje plik i automatycznie skonfiguruje resztę.
  5. Zdefiniuj zmienne środowiskowe. Podobnie jak w przypadku pakietów kompilacji musisz podać:
    • $TOKEN_USES_SELF_SIGNED_CA: prawda lub fałsz;
    • $ROOT_CA_CERT: ścieżka do certyfikatu głównego urzędu certyfikacji zakodowanego w formacie PEM;
    • $TOKEN_ISSUER_API_NAME: nazwa funkcji Firebase Cloud;
    • $TOKEN_ISSUER_HOST_NAME: SAN w certyfikacie;
    • $DRC_TEST_EMAIL$DRC_TEST_EMAIL: dane logowania do konta testowego, tylko w przypadku wersji debugowanych.
  6. Aby skompilować aplikację za pomocą Gradle, uruchom takie polecenie:
    $ ./gradlew build

Integracja z wydawcą tokenów

Wydawcą tokena referencyjnego jest funkcja Firebase Cloud Functions zaimplementowana w Node.js. Funkcja może być wywołana tylko przez uwierzytelnionego użytkownika. Przed wdrożeniem aplikacji musisz skonfigurować klucz prywatny i certyfikaty używane do podpisywania tokenów JWS.

  1. Wypełnij plik JSON tymi danymi:
    {
        "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"
    }

    Certyfikaty są uporządkowane w kolejności od certyfikatu jednostki końcowej do certyfikatu głównego urzędu certyfikacji. Okres ważności można dostosować i wydłużyć, jeśli token wydany przez aplikację DRC potrzebuje trochę czasu, aby zostać odebrany i wykorzystany. Nie można cofnąć tokena.

  2. Prześlij konfigurację do Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
  4. Wdróż funkcję Cloud Functions na Firebase:
  5. $ firebase deploy --only functions
  6. Informacje o zarządzaniu wystawcą tokenów i jego monitorowaniu znajdziesz w artykule Zarządzanie opcjami wdrażania i wykonywalnych funkcji.

Ustawianie domyślnych ograniczeń

Domyślne ograniczenia można zastosować przed pierwszym uruchomieniem. Wykonaj to za pomocą statycznych nakładek zasobów, aby zastąpić domyślne wartości w ramach Androida. Ograniczenia można stosować odpowiednio do różnych typów użytkowników. Więcej informacji o różnych typach użytkowników znajdziesz w artykule Wsparcie dla wielu użytkowników.

Domyślne ograniczenie dla użytkownika systemu bezprzewodowego można skonfigurować za pomocą tablicy ciągów znaków config_defaultFirstUserRestrictionsframeworks/base/core/res/res/values/config.xml. Ustawienie tego ograniczenia automatycznie wyłącza Android Debug Bridge (ADB) do czasu usunięcia ograniczenia, na przykład:

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

Domyślne ograniczenia dla zwykłych użytkowników (np. kierowców i pasażerów) oraz gości można skonfigurować w frameworks/base/core/res/res/xml/config_user_types.xml. Możesz nakładać te ciągi znaków, aby ustawić domyślne ograniczenia dla poszczególnych typów użytkowników, na przykład:

<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>