この記事は Android プラットフォーム セキュリティ担当シニア ソフトウェア エンジニア、Bram Bonné、Android プラットフォーム セキュリティ担当スタッフ ソフトウェア エンジニア、Chad Brubaker による Google Online Security Blog の記事 "An Update on Android TLS Adoption" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

いくつかの端末とゲーム コントローラが描かれたバナーの図
Android は、ユーザー、端末、データを安全な状態に保つことに力を注いでいます。データを安全な状態に保つ方法の 1 つとして、Android 端末が送受信するネットワーク トラフィックを Transport Layer Security(TLS)で保護することがあげられます。

2016 年の Android 7(API レベル 24)では、ネットワーク セキュリティ構成導入され、アプリのデベロッパーが宣言的な構成ファイルでアプリのネットワーク セキュリティ ポリシーを設定できるようになりました。アプリの安全性を保証するため、Android 9(API レベル 28)以降をターゲットとするアプリには、すべてのドメインに対し、暗号化されていないトラフィックを防止するポリシーセットがデフォルトで自動設定されます。

現在は、うれしいことに、80% の Android アプリがデフォルトでトラフィックを暗号化しています。Android 9 以降をターゲットとしたアプリではこの比率がさらに上がり、90% がデフォルトでトラフィックを暗号化しています。
デフォルトでクリアテキストをブロックするアプリの比率
デフォルトでクリアテキストをブロックするアプリの比率

2019 年 11 月 1 日以降、すべてのアプリ(Google Play のアップデートおよびすべての新規アプリ)で Android 9 以降をターゲットにすることが必須になります。そのため、この数はさらに増えるものと考えられます。これらのアプリによるネットワーク トラフィックはデフォルトで安全です。暗号化されていない接続が利用されるのは、デベロッパーが明示的に選択した結果です。

Android Studio の最新リリースと Google Play のリリース前レポートは、アプリに安全でない可能性があるネットワーク セキュリティ構成が含まれている場合(たとえば、すべてのドメインに対して暗号化されていないトラフィックを許可している場合や、デバッグモード以外でユーザーが提供した証明書を受け入れている場合)、デベロッパーに警告します。これにより、Android エコシステム全体で HTTPS の採用が推奨され、デベロッパーがセキュリティ構成を確実に意識できるようになります。
Android Studio でデベロッパーに表示される警告の例
Android Studio でデベロッパーに表示される警告の例
リリース前レポートの一部としてデベロッパーに表示される警告の例
リリース前レポートの一部としてデベロッパーに表示される警告の例

アプリを安全にするためにできること

Android 9 以降をターゲットにしているアプリの場合、何の設定も必要とせずにすぐに使えるデフォルトで、すべての通信中のネットワーク トラフィックを暗号化し、標準の Android CA セットに含まれる認証局が発行した証明書のみを信頼するようになっています。アプリに例外を設ける唯一の方法は、注意深く例外を選択し、別のネットワーク セキュリティ構成ファイルを含めることです。

アプリで特定のドメインに対するトラフィックを許可しなければならない場合は、デフォルトのセキュリティ ポリシーに対する例外のみを記述したネットワーク セキュリティ構成ファイルを含めます。安全でない接続を通して受信したデータは、転送中に改ざんされるおそれがあるので、十分注意する必要があります。
<network-security-config>
    <base-config cleartextTrafficPermitted="false" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">insecure.example.com</domain>
        <domain includeSubdomains="true">insecure.cdn.example.com</domain>
    </domain-config>
</network-security-config>
アプリでテスト用にユーザーが指定した証明書の受け入れを可能にしなければならない場合(たとえば、テストの際にローカル サーバーに接続する場合)は、<debug-overrides> 要素の中に <trust-anchors> 要素を含めます。これにより、本番環境でのアプリの接続は確実に安全なものになります。 element inside a element. This ensures the connections in the production version of your app are secure.
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="user"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>

ライブラリを安全にするためにできること

ライブラリで直接安全な接続や安全でない接続を確立している場合は、isCleartextTrafficPermitted を確認して、アプリのクリアテキスト設定に従うようにします。これは、クリアテキスト接続をオープンする に行う必要があります。
Android のビルトイン ネットワーク ライブラリや、OkHttpVolley などのよく利用されている HTTP ライブラリは、ビルトイン ネットワーク セキュリティ構成をサポートしています。
Android プラットフォーム セキュリティ、Android Studio およびリリース前レポートチーム、Giles Hogben、Nwokedi Idika

Reviewed by Yuichi Araki - Developer Relations Team