Androidをお使いの場合、サイトやウェブアプリにアクセスしようとすると、「NET::ERR_CLEARTEXT_NOT_PERMITTED」というエラーメッセージに遭遇することがあります。これはAndroid特有のエラーで、発生するとそのコンテンツへのアクセスがブロックされてしまいます。
これは、そのサイトまたはアプリが平文(クリアテキストとも)、つまり暗号化されていない情報を使用していることが原因です。あなたがAndroid開発者またはサイト管理者の場合、このエラーを回避する方法があります。この記事を参考に実践してみてください。
まずはAndroid Webviewについて、そして「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーの原因についてご説明します。それから、このエラーのトラブルシューティング方法を3つご紹介していきます。
Android Webview
Webviewは、ブラウザではなくアプリ上でウェブページを閲覧することができるAndroid OS内蔵の機能で、ウェブアプリで主に使用されます。ウェブアプリとは、サイトをアプリとしてスマートフォンにインストールするためのソフトウェアです。
Webviewは、アプリ上でサイトにアクセスすることを可能にしますが、ブラウザほどの機能性はありません。したがって、ウェブを閲覧するには、WebviewよりもChromeなどのブラウザの方が適しています。
「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーは、Android Webviewを採用するアプリ特有のもので、Chrome などのブラウザで発生することはありません。ただし、一般的なブラウザを使用して、安全でないHTTP接続でPHPで構築されたサイトにアクセスしようとすると、「Not Secure」または「保護されていない通信」などの警告やその他のエラーに遭遇する可能性があります。
「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーとは
Webviewで、HTTPページなどの暗号化されていないコンテンツを情報を含むページを読み込むように設定すると、アプリで以下のようなエラーが返されます(Androidアプリ開発ツールでの表示例)。
このエラーは、サイトにアクセスできない、または技術的な問題があるという意味ではありません。例えば別のブラウザで同じURLにアクセスすると、問題なく閲覧できる可能性もあります。HTTPサイトであれば、安全でないサイトにアクセスしていることを示す警告のアイコンが表示される程度です。
このエラーは、Androidアプリ上でのみ発生するため、一見アプリ自体に問題があると思われがちですが、アプリ開発者やサイト管理者が実践できる回避策、トラブルシューティング方法があります。なお、アプリ利用者には、ブラウザでアクセスしてみる程度しか策がありません。
「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーの原因
Androidは、アプリが誤って暗号化されていないデータ、つまり「平文」を送信するのを防ぐようになっています。これはAndroid 9.0以降、アプリのデフォルト設定です。
この構成はAndroid Webviewを使用するアプリに適用されることから、このエラーはアプリ上でのみ発生します。
主な原因は、暗号化されていない情報にあり、そのトラブルシューティグ方法はさまざまです。例えば、アプリ開発者であれば、クリアテキストのサポートが有効になるよう、設定ファイルを編集することができます。
サイト所有者であれば、サイト内のすべてのページがHTTPSにリダイレクトされるように設定するのが効果的です。これによって、ユーザーが暗号化されていないチャネルにアクセスすることがなくなり、ウェブサイトを参照するAndroidアプリがこのエラーを返すことがなくなります。
「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーを解決するには(3つの方法)
それでは、Androidおよびサイトからこのエラーを解決する方法を詳しく見ていきましょう。なお、トラブルシューティングおよびエラーが解決したかどうかを確認するには、Androidデバイスが必要です。
1. AndroidManifest.xmlを編集する
Androidアプリケーションには、AndroidManifest.xmlファイルが含まれており、このファイルにはOS、Google Play Store、および一部の開発ツールで必要とされるアプリに関する情報が格納されています。
AndroidManifest.xmlファイルには、キーのアクセス権に関する情報や、アプリがWebView上で平文を読み込めるかどうかの情報読も含まれています。なお、Googleはセキュリティ上の問題から、平文の読み込みを許可しないよう勧告しています。したがって、この解決策は、対象のサイトが暗号化されたトラフィックに切り替わるまでの一時的なものであることを念頭に置いてください。
AndroidManifest.xmlの編集方法は、HTMLファイルの編集と似ており、アプリの.apkファイルまたはプロジェクトソースにアクセスします。アプリのプロジェクトソースファイルにアクセスする方法はいくつかありますが、Android開発者向けの公式統合開発環境(IDE)であるAndroid Studioを使った方法が推奨されています。
Android Studioでプロジェクトを開くと、標準化されたディレクトリ内すべての関連ファイルを表示することができます。AndroidManifest.xmlファイルは、manifestsディレクトリの中に格納されています。
このファイルを開いて、以下のような<application>サブ要素を見つけます。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
</application>
<application>サブ要素内の変数は変更される可能性があるため、<application>の開始タグと終了タグを必ず確認してください。タグを見つけたら、以下のコードを貼り付けます。
android:usesCleartextTraffic=”true”
変数usesCleartexTrafficがすでに「false」に設定されている場合は、「true」に変更します。その後、AndroidManifest.xmlに変更を保存してファイルを閉じ、プロジェクトに変更を保存しましょう。
2. network_security_config.xmlでドメインを許可する
Android 7.0以降、Googleではネットワークセキュリティ構成ファイルを使用して、特定のドメインやアプリを許可できるようになっています。簡単に言うと、network_security_config.xmlを使用すると、1つまたは複数のドメインに対するクリアテキストの制限を回避することができます。
この手法は、上でご紹介したアプリ全体でクリアテキストをサポートするよりも安全ですが、最も安全な方法は、Webviewを使用して安全なページのみにリンクすることです。
アプリ全体で平文をサポートするように設定すると、特定のドメインを許可リストに登録する必要がなくなるため、どちらか1つの方法を選択するのが理想的です。安全を重視する場合は、以下にご紹介する手順に従ってください。
まずは、アプリのnetwork_security_config.xmlファイルを作成します。これには先にも触れた通り、Android Studioでアプリプロジェクトを開き、 resディレクトリに移動します。
resディレクトリには、XMLファイル(AndroidManifest.xmlを除く)、ビットマップ画像など、アプリプロジェクトのすべての非コードファイルが格納されています。resディレクトリ内に「network_security_config.xml」という名前のファイルを作成して、以下のコードを貼り付けます。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">yourwebsite.com</domain>
</domain-config>
</network-security-config>
上のコードは、1つのドメイン上でクリアテキストの使用を許可するもので、さらに<domain includeSubdomains>要素を使って、URLをさらに追加することも可能です。ただし、セキュリティ上の理由から、この設定が不可欠なドメインのみに制限することをお勧めします。
network_security_config.xmlの変更を保存して、manifestsディレクトリに戻ります。ネットワークセキュリティ構成を有効にするには、AndroidManifest.xmlを再度編集します。
ファイルを開き、<application>サブ要素を見つけて、タグ内に以下のコードを貼り付けます。
android:networkSecurityConfig="@xml/network_security_config"
ファイルへの変更を保存した後、AndroidManifest.xmlを閉じます。これでアプリで指定したドメインで平文の使用が許可されます。
3. サイトをHTTPS化する
「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーを解決する最も安全な方法は、エラーメッセージを返すウェブサイトをHTTPS化することです。これによって、サイトとの間で送信されるすべてのデータを暗号化することができます。
現代のウェブにおいて、サイトをHTTPS化しない理由はもはやなし。セキュアソケットレイヤー(SSL)証明書は、無料で入手することができ、設定も数分でできてしまいます。現在では、Kinstaを含む一部のホスティングサービスでこの設定を代行しています。
Kinstaのホスティングプランをご利用の場合は、SSL証明書がサイトに自動設定されます。また、MyKinstaからサイトをHTTPSにリダイレクトすることも可能です。
これを行うには、MyKinstaにログイン後、該当のサイトを選択して「ツール」画面に移動します。「HTTPSリダイレクト」セクションの「利用する」をクリックすれば完了です。
Kinsta以外をご利用の場合は、WordPressの.htaccessファイルを編集してHTTPトラフィックをHTTPSにリダイレクトするか、プラグインを使用してください。後者の方法をとる場合、Really Simple SSLプラグインがおすすめです。
NginxとApacheでHTTPをHTTPSにリダイレクトする方法(Really Simple SSLプラグインを使った方法を含む)については、『WordPressでHTTPをHTTPSにリダイレクトする方法』をご覧ください。サイトをHTTPS化したら、Webviewを使用してサイトを閲覧する際に、このエラーに遭遇することはなくなるはずです。
まとめ
Androidで「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーに遭遇したら、使用しているアプリが平文、または保護されていない情報を送信しようとするページにアクセスしようとしていることを意味します。ユーザーデータの漏洩を防ぐため、Androidではこのようなページがブロックされるようになっています。
アプリの利用者、またはサイト訪問者であれば、ブラウザでアクセスすればこのエラーを回避することができます。開発者であれば、AndroidManifest.xmlを編集して、network_security_config.xmlでドメインを許可し、サイトをHTTPSに切り替えましょう。
Kinstaを利用すれば、SSL証明書の自動設定とワンクリックのHTTPSリダイレクトによって、自社のサイトでこの「NET::ERR_CLEARTEXT_NOT_PERMITTED」エラーが発生する確率はかなり低くなります。WordPress専用マネージドホスティングまたはアプリケーションホスティングの詳細をご確認の上、自社に合ったプランをご検討ください。