Leitfaden zur Integration des Debugging-Restriktionscontrollers

Befolgen Sie die Anweisungen auf dieser Seite, um den AAOS Debugging Restriction Controller (DRC) zu integrieren.

Abbildung 1. Beispiel einer DRC-App.

Die Architektur

Die DRC-Architektur ist in Abbildung 2 dargestellt. Die rot umrandeten Komponenten (Token-Aussteller und DRC) verfügen über begleitende Referenzimplementierungen, die Sie anpassen können.

Abbildung 2. DRC-Architektur.

Was ist die Demokratische Republik Kongo?

Die Auto-Haupteinheit enthält die DRC-App (siehe Referenzimplementierung in packages/apps/Car/DebuggingRestrictionController ). Die Referenz-App umfasst die Logik zum Empfangen eines Zugriffstokens vom Tokenaussteller, zum Validieren des Tokens und zum anschließenden Anwenden von Debugging-Einschränkungsänderungen, wie im Token angegeben. Die Logik umfasst grundlegende UX-Elemente auf der Fahrzeugseite.

Was ist der Token-Emittent?

Dies ist ein Webdienst, der kryptografisch signierte Zugriffstoken ausgibt (siehe Referenzimplementierung in packages/apps/Car/DebuggingRestrictionController/server ). Der Referenz-Webdienst ist eine bereitstellbare Firebase Cloud-Funktion (weitere Informationen finden Sie unter Cloud-Funktionen für Firebase ).

Voraussetzungen

Bevor Sie eine Referenzimplementierung bereitstellen, müssen Sie unbedingt die folgenden Aufgaben ausführen.

Bereiten Sie Zertifikate zum Signieren von Zugriffstoken vor

Der Token-Aussteller generiert JSON Web Signatures (JWS) als Zugriffstoken. Für eine optimale Kompatibilität unterstützt der Referenzherausgeber nur den RS256-Algorithmus (RSA-Signaturen mit SHA256). Um die Schlüsselrotation zu erleichtern, verwenden Sie zum Signieren von Zugriffstokens eine Zertifikatskette anstelle eines einzelnen Zertifikats. Eine typische Zertifikatskette sollte aus einem Stamm-CA-Zertifikat, einem Zwischen-CA-Zertifikat und einem End-Entity-Zertifikat bestehen.

Das Endentitätszertifikat, das die JWS-Token signiert, unterscheidet sich nicht von einem Standard-TLS-Zertifikat. Sie können entweder ein Zertifikat von öffentlichen Zertifizierungsstellen wie DigiCert erwerben oder Ihre eigene Zertifikatskette mithilfe selbstsignierter Root-CA-Zertifikate oder Hardware-Sicherheitsmodule verwalten. Das Endentitätszertifikat sollte ein X509v3-Zertifikat mit der Erweiterung Subject Alternative Name (SAN) sein. Die SAN-Erweiterung enthält eine Kennung (z. B. Hostname) des Token-Ausstellers. Schließlich sollten RSA-Zertifikate gegenüber EC-Zertifikaten bevorzugt werden, da der Token-Aussteller nur RS256 unterstützt.

Google stellt ein Shell-Skript zum Generieren selbstsignierter Zertifikate in packages/apps/Car/DebuggingRestrictionController/server/genkey.sh bereit.

Richten Sie Firebase ein

Der Referenz-Token-Aussteller verwendet Firebase Authentication und Firebase Cloud Function .

So richten Sie Ihr Firebase-Konto ein:

  1. Informationen zum Erstellen eines Firebase-Projekts finden Sie unter Hinzufügen von Firebase zu Ihrem Android-Projekt .
  2. Informationen zum Aktivieren einiger Firebase-Authentifikatoren finden Sie unter Wo fange ich mit der Firebase-Authentifizierung an? .
  3. Informationen zum Hinzufügen einer leeren Firebase Cloud-Funktion finden Sie unter Erste Schritte .
  4. Falls noch nicht geschehen, installieren Sie die Tools Node.js , NPM und Firebase, um den Token-Aussteller zu kompilieren und bereitzustellen.

Integrieren Sie die DRC-App

Die Referenz-DRC-App befindet sich in packages/apps/Car/DebuggingRestrictionController . Die App kann gebündelt in AOSP mit Soong oder entbündelt mit Gradle erstellt werden.

Gebündelter Build

So erstellen Sie eine gebündelte App:

  1. Kopieren Sie applicationId , projectId und apiKey aus google-services.json in packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java . Dadurch kann die DRC-App eine korrekte Verbindung zu Firebase herstellen.
  2. Aktualisieren Sie diese Konstanten in packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java :
    • TOKEN_USES_SELF_SIGNED_CA gibt an, ob selbstsignierte Root-CA-Zertifikate verwendet werden. Wenn diese Option aktiviert ist, vertraut die DRC-App nur dem PEM-codierten Stamm-CA-Zertifikat, das in ROOT_CA_CERT angegeben ist.
    • TOKEN_ISSUER_API_NAME ist der Name der Firebase Cloud-Funktion und sollte mit der Cloud-Funktion übereinstimmen, die Sie zuvor in der Firebase Console erstellt haben.
    • TOKEN_ISSUER_HOSTNAME sollte mit dem alternativen Antragstellernamen im Endentitätszertifikat übereinstimmen, das die Zugriffstoken signiert.
    • DRC_TEST_EMAIL und DRC_TEST_PASSWORD sind Anmeldeinformationen für ein optionales Testkonto, das in Firebase vorab bereitgestellt werden kann, wenn Sie die E-Mail-/Passwort-Anmeldung aktiviert haben. Diese werden nur für instrumentierte Tests verwendet.

Die App ist jetzt für die Verwendung Ihres Firebase-Kontos und Ihrer Zertifikate konfiguriert. In Android 9 und höher müssen Sie die Zulassungsliste für privilegierte Berechtigungen einrichten. Die Zulassungsliste muss mindestens android.permission.MANAGE_USERS enthalten. Zum Beispiel:

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

Entbündelter Aufbau

Entbündelte DRC-Builds verwenden Gradle zum Kompilieren der App.

So erstellen Sie einen entbündelten Build:

  1. Bestätigen Sie, dass Sie das Android SDK installiert haben.
  2. Erstellen Sie eine Textdatei mit dem Namen local.properties im Stammverzeichnis der App.
  3. Legen Sie den Speicherort des Android SDK fest:
     sdk.dir=path/to/android/sdk
    
  4. Um Firebase einzurichten, kopieren Sie google-services.json nach packages/apps/Car/DebuggingRestrictionController/app . Gradle analysiert die Datei und richtet den Rest automatisch ein.
  5. Definieren Sie die Umgebungsvariablen. Wie bei gebündelten Builds müssen Sie Folgendes angeben:
    • $TOKEN_USES_SELF_SIGNED_CA : wahr oder falsch;
    • $ROOT_CA_CERT : Pfad zum PEM-codierten Root-CA-Zertifikat;
    • $TOKEN_ISSUER_API_NAME : Name der Firebase Cloud-Funktion;
    • $TOKEN_ISSUER_HOST_NAME : SAN im Zertifikat;
    • $DRC_TEST_EMAIL und $DRC_TEST_EMAI L: Anmeldeinformationen für ein Testkonto, nur Debug-Builds.
  6. Um die App mit Gradle zu erstellen, führen Sie einen Befehl wie diesen aus:
    $ ./gradlew build
    

Integrieren Sie den Token-Aussteller

Der Referenz-Token-Aussteller ist eine Firebase Cloud Function, die in Node.js implementiert ist. Die Funktion kann nur von einem authentifizierten Benutzer aufgerufen werden. Bevor Sie die App bereitstellen, müssen Sie den privaten Schlüssel und die Zertifikate einrichten, die zum Signieren der JWS-Tokens verwendet werden.

  1. Füllen Sie eine JSON-Datei mit folgendem Inhalt:
    {
        "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"
    }
    

    Zertifikate werden mit dem Endentitätszertifikat zuerst und dem Stamm-CA-Zertifikat am Ende bestellt. Der Ablaufzeitraum ist anpassbar und kann auf eine längere Dauer eingestellt werden, wenn ein ausgegebener Token einige Zeit benötigt, bevor er von einer DRC-App empfangen und verbraucht werden kann. Der Token-Widerruf wird nicht unterstützt.

  2. Laden Sie die Konfiguration in Firebase hoch:
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Stellen Sie die Firebase Cloud-Funktion bereit:
  5. $ firebase deploy --only functions
    
  6. Informationen zum Verwalten und Überwachen Ihres Token-Ausstellers finden Sie unter Verwalten der Funktionsbereitstellung und Laufzeitoptionen .

Legen Sie Standardeinschränkungen fest

Vor dem ersten Start können Standardeinschränkungen angewendet werden. Tun Sie dies mit statischen Ressourcen-Overlays, um die Standardeinstellungen im Android-Framework zu überschreiben. Einschränkungen können jeweils auf verschiedene Benutzertypen angewendet werden. Weitere Informationen zu den verschiedenen Benutzertypen finden Sie unter Multi-User-Support .

Die Standardeinschränkung für den Headless-Systembenutzer kann mit dem String-Array config_defaultFirstUserRestrictions in frameworks/base/core/res/res/values/config.xml konfiguriert werden. Durch das Festlegen dieser Einschränkung wird Android Debug Bridge (ADB) automatisch deaktiviert, bis die Einschränkung aufgehoben wird, zum Beispiel:

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

Die Standardeinschränkungen für reguläre Benutzer (z. B. Fahrer und Passagiere) und Gäste können in frameworks/base/core/res/res/xml/config_user_types.xml konfiguriert werden. Sie können diese Zeichenfolgen überlagern, um die Standardeinschränkungen für jeden Benutzertyp festzulegen, zum Beispiel:

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