디버깅 제한 컨트롤러 통합 가이드

이 페이지의 지침을 사용하여 AAOS DRC(디버깅 제한 컨트롤러)를 통합하세요.

그림 1. DRC 앱 예시.

건축학

DRC 아키텍처는 그림 2에 설명되어 있습니다. 빨간색으로 표시된 구성 요소(토큰 발급자 및 DRC)에는 사용자 정의할 수 있는 참조 구현이 함께 제공됩니다.

그림 2. DRC 아키텍처.

콩고민주공화국(DRC)이 무엇인가요?

자동차 헤드 유닛에는 DRC 앱이 포함되어 있습니다( packages/apps/Car/DebuggingRestrictionController 의 참조 구현 참조). 참조 앱에는 토큰 발급자로부터 액세스 토큰을 받고, 토큰의 유효성을 검사한 다음, 토큰에 지정된 대로 디버깅 제한 변경 사항을 적용하기 위한 논리가 포함되어 있습니다. 로직에는 자동차 측의 기본 UX 요소가 포함됩니다.

토큰 발행자는 무엇입니까?

이는 암호화된 액세스 토큰을 발행하는 웹 서비스입니다( packages/apps/Car/DebuggingRestrictionController/server 의 참조 구현 참조). 참조 웹 서비스는 배포 가능한 Firebase Cloud 함수입니다(자세한 내용은 Firebase용 Cloud Functions 참조).

전제 조건

참조 구현을 배포하기 전에 다음 작업을 완료해야 합니다.

액세스 토큰 서명을 위한 인증서 준비

토큰 발급자는 JWS(JSON 웹 서명)를 액세스 토큰으로 생성합니다. 최적의 호환성을 위해 참조 발급자는 RS256 알고리즘(SHA256을 사용한 RSA 서명)만 지원합니다. 키 순환을 용이하게 하려면 단일 인증서 대신 인증서 체인을 사용하여 액세스 토큰에 서명하세요. 일반적인 인증서 체인은 루트 CA 인증서, 중간 CA 인증서 및 최종 엔터티 인증서로 구성되어야 합니다.

JWS 토큰에 서명하는 최종 엔터티 인증서는 표준 TLS 인증서와 다르지 않습니다. DigiCert와 같은 공용 CA에서 인증서를 구입하거나 자체 서명된 루트 CA 인증서 또는 하드웨어 보안 모듈을 사용하여 자체 인증서 체인을 유지 관리할 수 있습니다. 최종 엔터티 인증서는 SAN(주체 대체 이름) 확장이 포함된 X509v3 인증서여야 합니다. SAN 확장에는 토큰 발급자의 식별자(예: 호스트 이름)가 포함되어 있습니다. 마지막으로 토큰 발급자는 RS256만 지원하므로 EC 인증서보다 RSA 인증서를 선호해야 합니다.

Google은 packages/apps/Car/DebuggingRestrictionController/server/genkey.sh 에서 자체 서명 인증서를 생성하기 위한 쉘 스크립트를 제공합니다.

Firebase 설정

참조 토큰 발급자는 Firebase 인증Firebase Cloud Function을 사용합니다.

Firebase 계정을 설정하려면 다음 안내를 따르세요.

  1. Firebase 프로젝트를 만들려면 Android 프로젝트에 Firebase 추가를 참조하세요.
  2. 일부 Firebase 인증자를 활성화하려면 Firebase 인증은 어디서 시작하나요?를 참조하세요. .
  3. 빈 Firebase Cloud 함수를 추가하려면 시작하기 를 참조하세요.
  4. 아직 완료하지 않은 경우 Node.js , NPM 및 Firebase 도구를 설치하여 토큰 발급자를 컴파일하고 배포합니다.

DRC 앱 통합

참조 DRC 앱은 packages/apps/Car/DebuggingRestrictionController 에 있습니다. 앱은 Soong을 사용하여 AOSP에 번들로 빌드하거나 Gradle을 사용하여 번들 해제 할 수 있습니다.

번들 빌드

번들 앱을 빌드하려면 다음 안내를 따르세요.

  1. google-services.jsonapplicationId , projectIdapiKey packages/apps/Car/DebuggingRestrictionController/soong/FirebaseApplication.java 에 복사합니다. 이렇게 하면 DRC 앱이 Firebase에 올바르게 연결될 수 있습니다.
  2. packages/apps/Car/DebuggingRestrictionController/soong/BuildConfig.java 에서 다음 상수를 업데이트하세요.
    • TOKEN_USES_SELF_SIGNED_CA 자체 서명된 루트 CA 인증서가 사용되는지 여부를 나타냅니다. 활성화되면 DRC 앱은 ROOT_CA_CERT 에 지정된 PEM 인코딩 루트 CA 인증서만 신뢰합니다.
    • TOKEN_ISSUER_API_NAME 은 Firebase Cloud 함수의 이름이며 이전에 Firebase 콘솔에서 만든 Cloud 함수와 일치해야 합니다.
    • TOKEN_ISSUER_HOSTNAME 액세스 토큰에 서명할 최종 엔터티 인증서의 주체 대체 이름과 일치해야 합니다.
    • DRC_TEST_EMAILDRC_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으로 인코딩된 루트 CA 인증서의 경로입니다.
    • $TOKEN_ISSUER_API_NAME : Firebase Cloud 함수의 이름입니다.
    • $TOKEN_ISSUER_HOST_NAME : 인증서의 SAN;
    • $DRC_TEST_EMAIL$DRC_TEST_EMAI L: 테스트 계정용 자격 증명, 디버그 빌드 전용입니다.
  6. Gradle로 앱을 빌드하려면 다음과 같은 명령을 실행하세요.
    $ ./gradlew build
    

토큰 발급자 통합

참조 토큰 발급자는 Node.js 에 구현된 Firebase Cloud 함수입니다. 이 함수는 인증된 사용자만 호출할 수 있습니다. 앱을 배포하기 전에 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"
    }
    

    인증서는 최종 엔터티 인증서가 먼저, 루트 CA 인증서가 맨 뒤에 오도록 주문됩니다. 만료 기간은 사용자 정의가 가능하며, 발행된 토큰이 DRC 앱에서 수신되고 소비되기까지 시간이 걸리는 경우 더 긴 기간으로 설정할 수 있습니다. 토큰 취소는 지원되지 않습니다.

  2. Firebase에 구성을 업로드합니다.
  3. $ firebase functions:config:set api_config="$(cat YOUR_CONFIG.json)"
    
  4. Firebase Cloud 기능을 배포합니다.
  5. $ firebase deploy --only functions
    
  6. 토큰 발급자를 관리하고 모니터링하려면 함수 배포 및 런타임 옵션 관리를 참조하세요.

기본 제한 설정

처음 부팅하기 전에 기본 제한 사항을 적용할 수 있습니다. Android 프레임워크의 기본값을 재정의하려면 정적 리소스 오버레이를 사용하여 이 작업을 수행하세요. 제한은 다양한 유형의 사용자에게 각각 적용될 수 있습니다. 다양한 유형의 사용자에 대해 알아보려면 다중 사용자 지원을 참조하세요.

헤드리스 시스템 사용자 에 대한 기본 제한은 frameworks/base/core/res/res/values/config.xmlconfig_defaultFirstUserRestrictions 문자열 배열을 사용하여 구성할 수 있습니다. 이 제한을 설정하면 제한이 제거될 때까지 Android 디버그 브리지(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>