コンテンツに移動

よくアクセスするページ

最近アクセスしたページ

navigation

キーの構成証明

キーの構成証明により、端末のハードウェアでサポートされているキーストアにアプリで使用するキーが格納されるため信頼性が向上します。次のセクションでは、ハードウェアがサポートするキーのプロパティを検証する方法と、構成証明書の拡張機能データのスキーマを解釈する方法について説明します。

注: Android 7.0(API レベル 24)を搭載するごく一部の端末のみがハードウェアレベルのキーの構成証明をサポートします。Android 7.0 を実行するその他のすべての端末はソフトウェアレベルのキーの構成証明を使用します。本番環境レベルで端末のハードウェアがサポートするキーのプロパティを確認する前に、端末がハードウェアレベルのキーの構成証明をサポートすることを確認する必要があります。これを行うには、Google 構成証明ルートキーによって署名されたルート証明書が構成証明書チェーンに含まれていることに加えて、キーの説明のデータ構造内の attestationSecurityLevel 要素が TrustedEnvironment セキュリティ レベルに設定されていることを確認する必要があります。

ハードウェアがサポートするキーのペアを取得して検証する

キーの構成証明中に、キーのペアのエイリアスを指定します。そうすると、構成証明ツールが証明書チェーンを提供します。この証明書チェーンを使用して、そのキーペアのプロパティを検証できます。

端末がハードウェアレベルのキーの構成証明をサポートする場合、構成証明ルートキーを使用して、このチェーン内のルート証明書が署名されます。このルートキーは、端末メーカーが出荷前に端末のハードウェアがサポートするキーストアに挿入しています。

注: ハードウェアレベルのキーの構成証明が付属している端末、Android 7.0(API レベル 24)、および Google Play サービスでは、ルート証明書が Google 構成証明ルートキーによって署名されます。このルート証明書が Google のルート証明書のリスト内に表示されることを確認する必要があります。

キーの構成証明を実装するには、次の手順を実行します。

  1. KeyStore オブジェクトの getCertificateChain() メソッドを使用して、ハードウェアがサポートするキーストアに関連付けられている X.509 証明書のチェーンへの参照を取得します。
  2. CRL オブジェクトの isRevoked() メソッドを使用して、各証明書の有効性を確認します。

    警告: アプリ内でこのプロセスを直接完了することもできますが、信頼できる別個のサーバーで証明書の取り消しリストを確認する方が安全です。

  3. Attestation オブジェクトを作成し、証明書チェーンの最初の要素を引数として渡します。

    // "certificates" contains the certificate chain associated with a specific key
    // pair in the device's hardware-backed keystore.
    X509Certificate attestationCert = (X509Certificate) certificates[0];
    Attestation hardwareKeyAttestation = new Attestation(attestationCert);
    

    構成証明オブジェクトにより、この証明書内の拡張機能データが抽出され、この情報がより簡単にアクセスできる形式で保存されます。拡張機能データのスキーマに関する詳細については、証明書の拡張機能データのスキーマを参照してください。

  4. Attestation クラス内で Accessor メソッドを使用し、証明書から拡張機能データを取得します。これらのメソッドは、証明書の拡張機能データのスキーマで使われるものと同じ名前および構造階層を使用します。

    たとえば、端末の TEE の検証済みのブートキーを表示するには、次のメソッド シーケンスを使用します。

    // "hardwareKeyAttestation" contains the first element of the attestation
    // certificate chain.
    AuthorizationList teeAuthList = hardwareKeyAttestation.getTeeEnforced();
    RootOfTrust teeRootOfTrust = teeAuthList.getRootOfTrust();
    byte[] teeVerifiedBootKey = teeRootOfTrust.getVerifiedBootKey();
    
  5. Attestation オブジェクトの拡張機能データを、ハードウェアがサポートするキーに含まれると予測される値セットと比較します。

    警告: アプリ内でこのプロセスを直接完了することもできますが、信頼できる別個のサーバーで証明書の拡張機能データを確認する方が安全です。

証明書の拡張機能データのスキーマ

キーの構成証明を使用して、端末のハードウェアがサポートするキーストアのチェーン内にある最初の証明書に表示される拡張機能データを確認します。この証明書には、次の ASN.1 スキーマに応じて情報が格納されます。

KeyDescription ::= SEQUENCE {
    attestationVersion  INTEGER,
    attestationSecurityLevel  SecurityLevel,
    keymasterVersion  INTEGER,
    keymasterSecurityLevel  SecurityLevel,
    attestationChallenge  OCTET_STRING,
    reserved  OCTET_STRING,
    softwareEnforced  AuthorizationList,
    teeEnforced  AuthorizationList,
}

SecurityLevel ::= ENUMERATED {
    Software  (0),
    TrustedEnvironment  (1),
}

AuthorizationList ::= SEQUENCE {
    purpose  [1] EXPLICIT SET OF INTEGER OPTIONAL,
    algorithm  [2] EXPLICIT INTEGER OPTIONAL,
    keySize  [3] EXPLICIT INTEGER OPTIONAL,
    digest  [5] EXPLICIT SET OF INTEGER OPTIONAL,
    padding  [6] EXPLICIT SET OF INTEGER OPTIONAL,
    ecCurve  [10] EXPLICIT INTEGER OPTIONAL,
    rsaPublicExponent  [200] EXPLICIT INTEGER OPTIONAL,
    activeDateTime  [400] EXPLICIT INTEGER OPTIONAL,
    originationExpireDateTime  [401] EXPLICIT INTEGER OPTIONAL,
    usageExpireDateTime  [402] EXPLICIT INTEGER OPTIONAL,
    noAuthRequired  [503] EXPLICIT NULL OPTIONAL,
    userAuthType  [504] EXPLICIT INTEGER OPTIONAL,
    authTimeout  [505] EXPLICIT INTEGER OPTIONAL,
    allowWhileOnBody  [506] EXPLICIT NULL OPTIONAL,
    allApplications  [600] EXPLICIT NULL OPTIONAL,
    applicationId  [601] EXPLICIT OCTET_STRING OPTIONAL,
    creationDateTime  [701] EXPLICIT INTEGER OPTIONAL,
    origin  [702] EXPLICIT INTEGER OPTIONAL,
    rollbackResistant  [703] EXPLICIT NULL OPTIONAL,
    rootOfTrust  [704] EXPLICIT RootOfTrust OPTIONAL,
    osVersion  [705] EXPLICIT INTEGER OPTIONAL,
    osPatchLevel  [706] EXPLICIT INTEGER OPTIONAL,
    attestationChallenge  [708] EXPLICIT INTEGER OPTIONAL,
    attestationApplicationId  [709] EXPLICIT OCTET_STRING OPTIONAL,
}

RootOfTrust ::= SEQUENCE {
    verifiedBootKey  OCTET_STRING,
    deviceLocked  BOOLEAN,
    verifiedBootState  VerifiedBootState,
}

VerifiedBootState ::= ENUMERATED {
    Verified  (0),
    SelfSigned  (1),
    Unverified  (2),
    Failed  (3),
}

次のリストでは、このスキーマ内の各要素について説明しています。

KeyDescription

これらの一連の値はキーの構成証明を通じて検証されるキーペアに関する一般的な情報を示しており、これらの値を使用して追加の詳細情報に簡単にアクセスできます。

attestationVersion
キーの構成証明機能のバージョン。1 に設定する必要があります。
attestationSecurityLevel

構成証明のセキュリティ レベル

警告: Android システムに格納されているキーを証明することは可能ですが(つまり、attestationSecurityLevel の値が Software に設定されているとき)、Android システムが侵害された場合、これらの構成証明を信頼することはできません。

keymasterVersion
Keymaster ハードウェア抽象化レイヤー(HAL)のバージョン。0 でバージョン 0.2 または 0.3、1 でバージョン 1.0、2 でバージョン 2.0 を表します。
keymasterSecurityLevel
Keymaster 実装のセキュリティ レベル
attestationChallenge
キーのペアに関連付けられているチャレンジ文字列(キーの構成証明によって検証される)。
reserved
システムアプリのみがこの値を使用します。他のすべてのアプリでは、この値は空です。
softwareEnforced
省略可能。端末の TEE ではなく、Android システムによって適用される Keymaster 承認リスト
teeEnforced
省略可能。端末の TEE によって適用される Keymaster 承認リスト

SecurityLevel

このデータ構造は、キーペアなどのソフトウェア機能が端末内の場所に基づいて保護される範囲を示します。

データ構造は列挙型であるため、次のいずれかの値を使用します。

Software
この機能を作成および管理するロジックは、Android システムに実装されています。キーペアを作成して保存する場合、この場所は TEE よりも安全性が低くなりますが、アプリのプロセス領域よりも安全です。
TrustedEnvironment
この機能を作成および管理するロジックは、TEE などの安全なハードウェアに実装されています。キーペアを作成して保存する場合、安全なハードウェアはリモートからの侵害に対して堅牢性が高いため、この場所はより安全です。

AuthorizationList

Keymaster ハードウェア抽象化レイヤー(HAL)で定義されているように、このデータ構造には、キーペアのプロパティ自体が含まれます。これらの値を端末の現在の状態または予測される値セットと比較し、キーペアがアプリでの使用に対して引き続き有効であることを確認します。

各フィールド名は、同様に命名された Keymaster タグに対応します。たとえば、承認リスト内の keySize フィールドは、KM_TAG_KEY_SIZE Keymaster タグに対応します。

次のリストの各フィールドは省略可能です。

purpose
KM_TAG_PURPOSE Keymaster タグに対応し、タグ ID 値 1 を使用します。
algorithm

KM_TAG_ALGORITHM Keymaster タグに対応し、タグ ID 値 2 を使用します。

AuthorizationList オブジェクトがキーの構成証明に関連付けられると、この値は常に KM_ALGORITHM_RSA または KM_ALGORITHM_EC になります。

keySize
KM_TAG_KEY_SIZE Keymaster タグに対応し、タグ ID 値 3 を使用します。
digest
KM_TAG_DIGEST Keymaster タグに対応し、タグ ID 値 5 を使用します。
padding
KM_TAG_PADDING Keymaster タグに対応し、タグ ID 値 6 を使用します。
ecCurve

KM_TAG_EC_CURVE Keymaster タグに対応し、タグ ID 値 10 を使用します。

Android システムのキーストア内で楕円曲線(EC)キーペアを生成するときに使用するパラメータ セットであり、ECDSA を使用して署名および検証を行います。

rsaPublicExponent
KM_TAG_RSA_PUBLIC_EXPONENT Keymaster タグに対応し、タグ ID 値 200 を使用します。
activeDateTime
KM_TAG_ACTIVE_DATETIME Keymaster タグに対応し、タグ ID 値 400 を使用します。
originationExpireDateTime
KM_TAG_ORIGINATION_EXPIRE_DATETIME Keymaster タグに対応し、タグ ID 値 401 を使用します。
usageExpireDateTime
KM_TAG_USAGE_EXPIRE_DATETIME Keymaster タグに対応し、タグ ID 値 402 を使用します。
noAuthRequired

KM_TAG_NO_AUTH_REQUIRED Keymaster タグに対応し、タグ ID 値 503 を使用します。

AuthorizationList オブジェクトがキーの構成証明に関連付けられると、この値は常に true になります。

userAuthType
KM_TAG_USER_AUTH_TYPE Keymaster タグに対応し、タグ ID 値 504 を使用します。
authTimeout
KM_TAG_AUTH_TIMEOUT Keymaster タグに対応し、タグ ID 値 505 を使用します。
allowWhileOnBody

KM_TAG_ALLOW_WHILE_ON_BODY Keymaster タグに対応し、タグ ID 値 506 を使用します。

ユーザーが端末を身に付け続けている場合、認証のタイムアウト期限後もキーを使用できます。安全な内蔵センサーによりユーザーが端末を身に付けているかどうかが判定されることに注意してください。

AuthorizationList オブジェクトがキーの構成証明に関連付けられると、この値は常に true になります。

allApplications

KM_TAG_ALL_APPLICATIONS Keymaster タグに対応し、タグ ID 値 600 を使用します。

端末上のすべてのアプリがキーペアにアクセスできるかどうかを示します。

AuthorizationList オブジェクトがキーの構成証明に関連付けられると、この値は常に true になります。

applicationId
KM_TAG_APPLICATION_ID Keymaster タグに対応し、タグ ID 値 601 を使用します。
creationDateTime
KM_TAG_CREATION_DATETIME Keymaster タグに対応し、タグ ID 値 701 を使用します。
origin

KM_TAG_ORIGIN Keymaster タグに対応し、タグ ID 値 702 を使用します。

AuthorizationList オブジェクトがキーの構成証明に関連付けられると、通常、この値は KM_ORIGIN_GENERATED に設定されます。ただし、構成証明で Keymaster バージョン 0.2 または 0.3 を使用する場合、オリジンが KM_ORIGIN_UNKNOWN に設定されることがあります。

rollbackResistant
KM_TAG_ROLLBACK_RESISTANT Keymaster タグに対応し、タグ ID 値 703 を使用します。
rootOfTrust

KM_TAG_ROOT_OF_TRUST Keymaster タグに対応し、タグ ID 値 704 を使用します。

詳細については、RootOfTrust データ構造について説明しているセクションを参照してください。

osVersion

KM_TAG_OS_VERSION Keymaster タグに対応し、タグ ID 値 705 を使用します。

Keymaster に関連付けられている Android オペレーティング システムのバージョンは、6 桁の整数で指定されます。たとえば、バージョン 6.0.1 は 060001 と表されます。

Keymaster バージョン 1.0 以上のみで、承認リストにこの値が含まれます。

osPatchLevel

KM_TAG_PATCHLEVEL Keymaster タグに対応し、タグ ID 値 706 を使用します。

Keymaster 内で使用されているセキュリティ パッチに関連付けられている月と年は、6 桁の整数で指定されます。たとえば、2016 年 6 月のパッチは 201606 と表されます。

Keymaster バージョン 1.0 以上のみで、承認リストにこの値が含まれます。

attestationChallenge

KM_TAG_ATTESTATION_CHALLENGE Keymaster タグに対応し、タグ ID 値 708 を使用します。

キーペアに関連付けられているチャレンジ文字列(Keymaster で定義)。

attestationApplicationId

KM_TAG_ATTESTATION_APPLICATION_ID Keymaster タグに対応し、タグ ID 値 709 を使用します。

キーペアによって署名された構成証明書の一意の ID(Keymaster にある)。

RootOfTrust

この一式の値により、端末のステータスに関するキー情報が定義されます。

以下の各フィールドは必須です。

verifiedBootKey

システム イメージを検証するためのキーの安全なハッシュ。このハッシュには SHA-256 アルゴリズムを使用することをお勧めします。

deviceLocked
端末のブートローダーがロックされている場合、この値は true になり、セキュアブート チェックが有効になり、署名されていない端末イメージが端末にフラッシュされることを防止します。この機能に関する詳細については、ブートの検証を参照してください。
verifiedBootState
セキュアブート機能に応じた、端末のブート状態
osVersion
端末上の Android オペレーティング システムの現在のバージョンは、6 桁の整数で指定されます。たとえば、バージョン 6.0.1 は 060001 と表されます。
patchMonthYear
端末に現在インストールされているセキュリティ パッチに関連付けられている月と年は、6 桁の整数で指定されます。たとえば、2016 年 8 月のパッチは 201608 と表されます。

VerifiedBootState

このデータ構造は端末の現在のブート状態を示します。つまり、端末のブートが完了した後、ユーザーおよびアプリに提供される保護のレベルを表します。この機能に関する詳細については、「ブートの検証」のブートの状態のセクションを参照してください。

このデータ構造は列挙型であるため、次のいずれかの値を使用します。

Verified

ブートローダー、ブート パーティション、すべての検証済みパーティションなどが含まれる完全な信頼チェーンを示します。

端末がこのブート状態のときは、verifiedBootKey が、端末に組み込まれた証明書のハッシュになります。これは、端末メーカーが出荷前に端末の ROM に追加しています。

SelfSigned

端末に組み込まれた証明書によって端末のブート パーティションが検証されていることに加えて、署名が有効であることを示します。

端末がこのブート状態のときは、verifiedBootKey が、ユーザーによりインストールされた証明書のハッシュになります。これにより、メーカーが提供する元のブート パーティションの代わりに、ユーザーが端末に追加したブート パーティションが署名されます。

Unverified
ユーザーが端末に変更を自由に加えられることを示します。したがって、ユーザーには、端末の整合性を保証する責任があります。
Failed
端末で検証に失敗したことを示します。構成証明書では、VerifiedBootState に対してこの値を使用することはできません。
このサイトでは、ユーザーが選択したサイトの言語と表示設定を保存する目的で Cookie を使用しています。

Android デベロッパー向けの最新情報やヒントを入手して、Google Play での成功を手に入れましょう。

* 必須

送信しました

WeChat で Google Developers をフォローする

このサイトをで表示しますか?

ページの表示言語としてを選択しましたが、このサイトの言語はに設定されています。

言語設定を変更してこのサイトをで表示しますか?言語設定を変更する場合は、各ページの下にある言語メニューを使用してください。

このクラスには、API レベル 以上が必要です。

API レベル が選択されているため、このドキュメントは非表示になっています。左のナビゲーションの上にあるセレクタを使って、ドキュメントの API レベルを変更できます。

アプリに必要な API レベルを指定する方法について、詳しくは異なるプラットフォーム バージョンのサポートをご覧ください。

Take a short survey?
Help us improve the Android developer experience. (April 2018 — Developer Survey)