Android 8: Cleartext HTTP トラフィックの禁止に関するコード例
Android 8: Cleartext HTTP トラフィックの禁止について
Android 8 (Oreo) から、セキュリティ強化の一環として、アプリが HTTP プロトコルを使用してネットワーク通信を行うことがデフォルトで禁止されました。これは、HTTP が暗号化されていないため、通信内容が盗聴されるリスクが高いためです。
具体的な影響
- アプリのクラッシュ: 既存のアプリが HTTP で通信している場合、Android 8 以降のデバイスではクラッシュする可能性があります。
- 機能制限: アプリが HTTP で通信する機能が正常に動作しなくなる可能性があります。
対応方法
- HTTPSの使用: アプリがネットワーク通信を行う場合は、HTTPS プロトコルを使用するように変更します。HTTPS は通信内容を暗号化するため、セキュリティが向上します。
- NetworkSecurityConfigの使用:
NetworkSecurityConfig
という設定ファイルを使用することで、特定のドメインに対して HTTP 通信を許可することができます。ただし、セキュリティリスクを考慮して慎重に使用してください。
コード例 (HTTPSの使用)
val url = URL("https://example.com/api")
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
val response = connection.inputStream. use { it.readBytes() }
コード例 (NetworkSecurityConfigの使用)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config includedDomains="example.com">
<trust-certificates>
<certificates src="@raw/your_certificate"/>
</trust-certificates>
</domain-config>
</network-security-config>
注意:
your_certificate
は、通信先のサーバーの証明書を指定します。- NetworkSecurityConfigを使用する場合も、セキュリティリスクを考慮して慎重に使用してください。
HTTPSの使用
val url = URL("https://example.com/api")
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
val response = connection.inputStream. use { it.readBytes() }
解説:
URL("https://example.com/api")
で HTTPS URL を指定します。HttpURLConnection
を使用して HTTP 接続を確立します。requestMethod = "GET"
で HTTP メソッドを GET に設定します。inputStream.use { it.readBytes() }
でレスポンスのデータを読み込みます。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config includedDomains="example.com">
<trust-certificates>
<certificates src="@raw/your_certificate"/>
</trust-certificates>
</domain-config>
</network-security-config>
network-security-config
ファイルを作成します。domain-config
で許可するドメインを指定します。trust-certificates
で信頼する証明書を指定します。src="@raw/your_certificate"
で証明書のリソースを指定します。
このファイルは res/xml/network_security_config.xml
のように配置します。
アプリのマニフェストファイル (AndroidManifest.xml) で NetworkSecurityConfig を参照します:
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
>
OkHttp を使用して HTTP/2 を活用する
- HTTP/2 は、より効率的で高速な通信プロトコルです。
- OkHttp は、HTTP/2 をサポートしているライブラリです。
- OkHttp を使用することで、HTTP/2 のメリットを活用しながら、セキュリティを確保することができます。
VPN (Virtual Private Network) を使用して通信を暗号化する
- VPN を使用することで、通信全体を暗号化することができます。
- VPN を使用すれば、HTTP 通信であっても安全に通信することができます。
- ただし、VPN の使用にはセキュリティリスクやパフォーマンス低下などのデメリットもあります。
カスタムプロトコル を使用して通信を暗号化する
- 自前のプロトコルを実装することで、独自の暗号化方式を使用することができます。
- ただし、セキュリティの確保が難しい場合があり、実装コストも高くなります。
具体的なコード例 (OkHttp)
val client = OkHttpClient()
val request = Request.Builder()
.url("https://example.com/api")
.build()
val response = client.newCall(request).execute()
val body = response.body?.string()
具体的なコード例 (VPN)
// VPN 接続の処理 (VPN ライブラリを使用)
// ...
// VPN 接続後に HTTP 通信を行う
val url = URL("http://example.com/api")
val connection = url.openConnection() as HttpURLConnection
connection.requestMethod = "GET"
val response = connection.inputStream. use { it.readBytes() }
具体的なコード例 (カスタムプロトコル)
// カスタムプロトコルの実装 (暗号化処理など)
// ...
// カスタムプロトコルを使用して通信を行う
// ...
android http https