Android N(7)からのhttp(s)接続のこと
なんか変わったぽいので、情報をつまみ食いしてみる。
ネットワーク セキュリティ構成 | Android Developers
こちらとかも。
なんでも、Android7から、ネットワークセキュリティ構成機能(network-security-config)てのが追加されたぽい。
証明書まわりとかで、セキュリティの向上を図っている感じかな。
いろいろあるだろうが、ここでは
・HTTPでの接続は原則、怒られるようになり、回避するには仕込みが必要。
てところを確認してみたい。
(前略。適当にonCreateなり何なり好きなとこに) (UIスレッドで通信処理すると怒られるので、適当やっつけThreadで書いている。 ほんとはしかるべき非同期処理の記述を選択すべきだろう。) Thread thread = new Thread(new Runnable() { @Override public void run() { HttpURLConnection con = null; URL url = null; //これは特に問題なく接続。(ステータスコード200返却) String urlSt = "https://www.yahoo.co.jp"; //こっち(http)は、network-security-configの仕込み必要となる。 //String urlSt = "http://www.yahoo.co.jp"; //※なお接続成功するとステータスコード301返却される。 // 301なのはyahoo側でhttp→httpsにリダイレクトしてるからだろうから、 // 200が返らないのは当然で、また当記事の本質とは関係ないので気にしない。 try { // URLの作成 url = new URL(urlSt); // 接続用HttpURLConnectionオブジェクト作成 con = (HttpURLConnection)url.openConnection(); // リクエストメソッドの設定 con.setRequestMethod("GET"); // リダイレクトを自動で許可しない設定 con.setInstanceFollowRedirects(false); // URL接続からデータを読み取る場合はtrue con.setDoInput(true); // URL接続にデータを書き込む場合はtrue con.setDoOutput(true); // 接続 con.connect(); // 本文の取得 InputStream in = con.getInputStream(); byte bodyByte[] = new byte[1024]; in.read(bodyByte); in.close(); System.out.println(con.getResponseCode()); System.out.println(bodyByte); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); thread.start();
インターネット接続なので。マニフェストにはいつもの。
<uses-permission android:name="android.permission.INTERNET"/>
ヤフーに接続(GET)してるだけ。
URLがhttps~ならここまでで十分で、今まで通りの感覚。
さて、httpの場合、network-security-configという機構の仕込みが必要になった模様。
マニフェストには
<application (省略) android:networkSecurityConfig="@xml/network_security_config" >
と書いてやり、そのxmlを用意(~res/xml/network_security_config.xml)
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- ここに書いたドメインには、httpで接続しても怒られなくなる、みたいな感じぽい。 --> <domain includeSubdomains="true">yahoo.co.jp</domain> </domain-config> </network-security-config>
http接続だと、上記をちゃんとしてないと、
NetworkSecurityConfig: No Network Security Config specified, using platform default
とか
java.io.IOException: Cleartext HTTP traffic to www.yahoo.co.jp not permitted
とか
怒られてしまうようだ。
まあ今日びはhttpsでつなぎなさいよ、てことか。みんな常時SSLとか言ってるしなあ。
証明書の管理とかめんどくさいイメージ(個人の感想です)。
まあ開発環境とかでhttp使うなら役立つかも、てとこかなあ。
脱線するけれど、開発環境といえば、https~で立てるときにオレオレ証明書だとナニな感じなので
無理やり信用しちゃう(エラーを無視する)、みたいなことをやった記憶。
こちらとか参考になるかも。
ishiitakeru-programing-memo.blogspot.com
うっかりこういう設定のままリリースしないように気をつけなきゃ、ですね。