Przewodnik po integracji kontrolera ograniczeń debugowania

Skorzystaj z instrukcji na tej stronie, aby zintegrować kontroler ograniczeń debugowania AAOS (DRC).

Rysunek 1. Przykład aplikacji DRC.

Architektura

Architekturę DRC przedstawiono na rysunku 2. Komponentom zaznaczonym na czerwono (wystawca tokenu i DRC) towarzyszą implementacje referencyjne, które można dostosować.

Rysunek 2. Architektura DRK.

Co to jest DRK?

Radioodtwarzacz samochodowy zawiera aplikację DRC (zobacz implementację referencyjną w packages/apps/Car/DebuggingRestrictionController ). Aplikacja referencyjna obejmuje logikę odbierania tokenu dostępu od wystawcy tokenu, sprawdzania poprawności tokenu, a następnie stosowania zmian ograniczeń debugowania określonych w tokenie. Logika obejmuje podstawowe elementy UX po stronie samochodu.

Jaki jest wydawca tokena?

Jest to usługa internetowa, która wystawia kryptograficznie podpisane tokeny dostępu (patrz implementacja referencyjna w packages/apps/Car/DebuggingRestrictionController/server ). Referencyjna usługa internetowa to możliwa do wdrożenia funkcja Firebase Cloud (aby dowiedzieć się więcej, zobacz Funkcje Cloud dla Firebase ).

Warunki wstępne

Przed wdrożeniem implementacji referencyjnej należy wykonać następujące zadania.

Przygotuj certyfikaty do podpisywania tokenów dostępu

Wystawca tokenu generuje podpisy sieciowe JSON (JWS) jako tokeny dostępu. Aby zapewnić optymalną kompatybilność, wystawca referencyjny obsługuje tylko algorytm RS256 (sygnatury 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, certyfikatu pośredniego urzędu certyfikacji i certyfikatu jednostki końcowej.

Certyfikat jednostki końcowej podpisujący tokeny JWS nie różni się od standardowego certyfikatu TLS. Możesz kupić certyfikat od publicznych urzędów certyfikacji, takich jak DigiCert, lub utrzymywać własny łańcuch certyfikatów, korzystając z certyfikatów głównego urzędu certyfikacji z podpisem własnym lub sprzętowych modułów zabezpieczeń. Certyfikat jednostki końcowej powinien być certyfikatem X509v3 z rozszerzeniem alternatywnej nazwy podmiotu (SAN). Rozszerzenie SAN zawiera identyfikator (na przykład nazwę hosta) wystawcy tokenu. Wreszcie, certyfikaty RSA powinny być preferowane w stosunku do certyfikatów EC, ponieważ wystawca tokena obsługuje tylko RS256.

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

Skonfiguruj Firebase

Wystawca tokenu referencyjnego korzysta z uwierzytelniania Firebase i funkcji chmury Firebase .

Aby skonfigurować konto Firebase:

  1. Aby utworzyć projekt Firebase, zobacz Dodawanie Firebase do projektu na Androida .
  2. Aby włączyć niektóre uwierzytelniacze Firebase, zobacz Od czego zacząć uwierzytelnianie Firebase? .
  3. Aby dodać pustą funkcję Firebase Cloud, zobacz Rozpocznij .
  4. Jeśli jeszcze tego nie zrobiłeś, zainstaluj narzędzia Node.js , NPM i Firebase, aby skompilować i wdrożyć wystawcę tokena.

Zintegruj aplikację DRC

Aplikacja referencyjna DRC znajduje się w packages/apps/Car/DebuggingRestrictionController . Aplikację można zbudować w pakiecie z AOSP z Soong lub oddzielnie z Gradle .

Wersja w zestawie

Aby utworzyć dołączoną aplikację:

  1. Skopiuj applicationId , projectId i apiKey z google-services.json do packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java . Dzięki temu aplikacja DRC będzie mogła prawidłowo połączyć się z Firebase.
  2. Zaktualizuj te stałe w packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java :
    • TOKEN_USES_SELF_SIGNED_CA wskazuje, czy używane są certyfikaty głównego urzędu certyfikacji z podpisem własnym. Jeśli ta opcja jest włączona, aplikacja DRC ufa tylko certyfikatowi głównego urzędu certyfikacji zakodowanym w formacie PEM określonym w ROOT_CA_CERT .
    • TOKEN_ISSUER_API_NAME to nazwa funkcji Firebase Cloud i powinna odpowiadać funkcji Cloud utworzonej wcześniej w konsoli Firebase.
    • TOKEN_ISSUER_HOSTNAME powinien odpowiadać alternatywnej nazwie podmiotu w certyfikacie jednostki końcowej, który będzie podpisywał tokeny dostępu.
    • DRC_TEST_EMAIL i DRC_TEST_PASSWORD to dane uwierzytelniające dla opcjonalnego konta testowego, które można wstępnie udostępnić w Firebase, jeśli włączono logowanie za pomocą adresu e-mail/hasła. Są one używane wyłącznie do testów przyrządowych.

Aplikacja jest teraz skonfigurowana do korzystania z Twojego konta Firebase i certyfikatów. W Androidzie 9 i nowszych musisz skonfigurować listę dozwolonych z uprawnieniami uprzywilejowanymi . Lista dozwolonych musi zawierać co najmniej android.permission.MANAGE_USERS . Na przykład:

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

Niełączona kompilacja

Rozdzielone kompilacje DRC używają Gradle do kompilowania aplikacji.

Aby utworzyć rozłączoną kompilację:

  1. Potwierdź, że zainstalowałeś zestaw SDK systemu Android.
  2. Utwórz plik tekstowy o nazwie local.properties w katalogu głównym aplikacji.
  3. Ustaw lokalizację zestawu SDK systemu Android:
     sdk.dir=path/to/android/sdk
    
  4. Aby skonfigurować Firebase, skopiuj plik google-services.json do packages/apps/Car/DebuggingRestrictionController/app . Gradle analizuje plik i automatycznie konfiguruje resztę.
  5. Zdefiniuj zmienne środowiskowe. Podobnie jak w przypadku kompilacji pakietowych, musisz określić:
    • $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 i $DRC_TEST_EMAI L: dane uwierzytelniające dla konta testowego, tylko kompilacje debugowania.
  6. Aby zbudować aplikację za pomocą Gradle, uruchom następującą komendę:
    $ ./gradlew build
    

Zintegruj wystawcę tokena

Wystawcą tokenu referencyjnego jest funkcja chmury Firebase zaimplementowana w Node.js Funkcję może wywołać jedynie użytkownik uwierzytelniony. Przed wdrożeniem aplikacji należy skonfigurować klucz prywatny i certyfikaty używane do podpisywania tokenów JWS.

  1. Wypełnij plik JSON następującą zawartością:
    {
        "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ą zamawiane z certyfikatem jednostki końcowej na pierwszym miejscu i certyfikatem głównego urzędu certyfikacji na końcu. Okres wygaśnięcia można dostosować i można go ustawić na dłuższy, jeśli wystawiony token upłynie trochę czasu, zanim będzie mógł zostać odebrany i wykorzystany przez aplikację DRC. Odwoływanie tokenu nie jest obsługiwane.

  2. Prześlij konfigurację do Firebase:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Wdróż funkcję Firebase Cloud:
  5. $ firebase deploy --only functions
    
  6. Aby zarządzać wystawcą tokenu i monitorować go, zobacz Zarządzanie opcjami wdrażania funkcji i środowiska wykonawczego .

Ustaw domyślne ograniczenia

Domyślne ograniczenia można zastosować przed pierwszym uruchomieniem. Zrób to za pomocą statycznych nakładek zasobów, aby zastąpić ustawienia domyślne w środowisku Androida. Ograniczenia mogą być odpowiednio stosowane wobec różnych typów użytkowników. Aby dowiedzieć się więcej o różnych typach użytkowników, zobacz Wsparcie dla wielu użytkowników .

Domyślne ograniczenie dla bezgłowego użytkownika systemu można skonfigurować za pomocą tablicy ciągów config_defaultFirstUserRestrictions w frameworks/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 (na przykład 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 nałożyć te ciągi, aby ustawić domyślne ograniczenia odpowiednio dla każdego typu użytkownika, 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>