「Android 9以降でHTTPを利用する」の版間の差分

提供:MonoBook
編集の要約なし
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:




[[Android 9]]から「[[セキュリティ]]を強化する」という名目で[[アプリ]]内での通信は[[HTTPS]]が必須になり、[[HTTP]]で通信しようとすると以下のような例外を吐くようになった。
[[Android 9]]から「[[セキュリティ]]を強化する」という名目で[[アプリ]]内での通信は[[HTTPS]]が必須になり、[[HTTP]]で通信しようとすると以下のような例外を吐くようになりました。
  Java.IO.IOException: Cleartext HTTP traffic to localhost not permitted
  Java.IO.IOException: Cleartext HTTP traffic to localhost not permitted


== HTTPSの問題点 ==
=== デバッグがめんどくさい ===
ただ[[デバッグ]]のときは[[HTTPS]]と[[オレオレ証明証]]だと色々とめんどくさいし捗らない。
ただ[[デバッグ]]のときは[[HTTPS]]と[[オレオレ証明証]]だと色々とめんどくさいし捗らない。
=== 暗号化によるデータ増大 ===
HTTPSはHTTPと比較してデータ量が約10〜20倍に膨れ上がることがあります。
とくに小さいデータでは最低2〜3KBが追加され影響が大きくなります。
極端にいえば1バイトを送信したいのに鍵交換などだけで3000バイトくらいになります。
これは格安SIMの低速モードでは割と重大は問題になります。公称128Kbpsや64kbpsなどの携帯回線では実測値が公称値付近と絶好調に出たとしても、TLS暗号化を噛ますことによるデータ量の増大で実質的には9600bps程度しか流せないこともザラにあります。
小さいデータの代表格であるゲームなんかだと割と影響が大きいです。
よって、どう考えても重要ではないデータはHTTPで通信した方がよい。
== すべてのドメインでHTTP通信を許可する ==
== すべてのドメインでHTTP通信を許可する ==
「android:usesCleartextTraffic="true"」で全許可となる。
applicationタグの属性「android:usesCleartextTraffic="true"」で全許可となる。
当然ながらオススメされない方法である。
当然ながらオススメされない方法である。
この方法はそのうち[[Google Play]]の審査で弾かれるようになるかもしれない。
この方法はそのうち[[Google Play]]の審査で弾かれるようになるかもしれない。
30行目: 43行目:
=== xmlフォルダを作る ===
=== xmlフォルダを作る ===
* [[Android Studio]] = resフォルダ
* [[Android Studio]] = resフォルダ
* [[Xamarin.Android]] = Resourcesフォルダ
* [[.NET for Android]] = Resourcesフォルダ


上記フォルダの中に「xmlフォルダ」を新規作成する。
上記フォルダの中に「xmlフォルダ」を新規作成する。
45行目: 58行目:
   <!-- ドメイン毎の設定 -->
   <!-- ドメイン毎の設定 -->
   <domain-config cleartextTrafficPermitted="true">  
   <domain-config cleartextTrafficPermitted="true">  
     <!-- HTTP通信を許可するドメインを列挙しておく -->
     <!-- domainタグでHTTP通信を許可するドメインやIPアドレスを列挙する -->
     <domain includeSubdomains="true">10.0.2.2</domain>
     <domain includeSubdomains="true">yahoo.co.jp</domain>
    <domain includeSubdomains="true">google.co.jp</domain>
    <domain includeSubdomains="true">monobook.org</domain>
   </domain-config>
   </domain-config>



2024年10月29日 (火) 03:39時点における最新版


Android 9から「セキュリティを強化する」という名目でアプリ内での通信はHTTPSが必須になり、HTTPで通信しようとすると以下のような例外を吐くようになりました。

Java.IO.IOException: Cleartext HTTP traffic to localhost not permitted

HTTPSの問題点[編集 | ソースを編集]

デバッグがめんどくさい[編集 | ソースを編集]

ただデバッグのときはHTTPSオレオレ証明証だと色々とめんどくさいし捗らない。

暗号化によるデータ増大[編集 | ソースを編集]

HTTPSはHTTPと比較してデータ量が約10〜20倍に膨れ上がることがあります。 とくに小さいデータでは最低2〜3KBが追加され影響が大きくなります。 極端にいえば1バイトを送信したいのに鍵交換などだけで3000バイトくらいになります。

これは格安SIMの低速モードでは割と重大は問題になります。公称128Kbpsや64kbpsなどの携帯回線では実測値が公称値付近と絶好調に出たとしても、TLS暗号化を噛ますことによるデータ量の増大で実質的には9600bps程度しか流せないこともザラにあります。

小さいデータの代表格であるゲームなんかだと割と影響が大きいです。 よって、どう考えても重要ではないデータはHTTPで通信した方がよい。

すべてのドメインでHTTP通信を許可する[編集 | ソースを編集]

applicationタグの属性「android:usesCleartextTraffic="true"」で全許可となる。 当然ながらオススメされない方法である。 この方法はそのうちGoogle Playの審査で弾かれるようになるかもしれない。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.monobook.app1">
	<uses-sdk 
        android:minSdkVersion="21" 
        android:targetSdkVersion="28" />
    
    <!-- network_security_config.xmlを適用する -->
	<application 
        android:label="app1.Android" 
        android:usesCleartextTraffic="true" />
    
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>

特定のドメインのみHTTP通信を許可する[編集 | ソースを編集]

xmlフォルダを作る[編集 | ソースを編集]

上記フォルダの中に「xmlフォルダ」を新規作成する。

network_security_config.xmlを作る[編集 | ソースを編集]

さきほど作ったxmlフォルダ内にnetwork_security_config.xmlを新規作成する。

<?xml version="1.0" encoding="utf-8" ?>
<network-security-config>

  <!-- デフォルトの設定 -->
  <base-config cleartextTrafficPermitted="false" />

  <!-- ドメイン毎の設定 -->
  <domain-config cleartextTrafficPermitted="true"> 
    <!-- domainタグでHTTP通信を許可するドメインやIPアドレスを列挙する -->
    <domain includeSubdomains="true">yahoo.co.jp</domain>
    <domain includeSubdomains="true">google.co.jp</domain>
    <domain includeSubdomains="true">monobook.org</domain>
  </domain-config>

</network-security-config>

AndroidManifest.xmlを書き換える[編集 | ソースを編集]

AndroidManifest.xmlをマウスで右クリックして「プログラムから開く」の「ソースコードエディター」を選ぶ。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="org.monobook.app1">
	<uses-sdk 
        android:minSdkVersion="21" 
        android:targetSdkVersion="28" />
    
    <!-- network_security_config.xmlを適用する -->
	<application 
        android:label="app1.Android" 
        android:networkSecurityConfig="@xml/network_security_config">
        />
    
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
</manifest>


関連項目[編集 | ソースを編集]