hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

青空文庫がSSL/TLS1.0を無効化?

5/31頃からAndroid4.4(kitkat)で読書尚友での青空文庫のダウンロードができなくなったという報告を受けた。現象としてはAndroid5.0以上は問題なくダウンロードでき、4.4以下が全てダメらしい。調べたところ、どうやら青空文庫のaozora.gr.jpのサーバーがSSL/TLS1.0を無効化した為ではないかという推論に達した。
青空文庫SSL化については、以前から告知されており、4/1以降は https: のURLでないとアクセスができなくなっている。
2018年03月31日 青空文庫SSL化対応についてのお知らせ
https://www.aozora.gr.jp/soramoyou/soramoyouindex.html#000497
だがTLS1.0の無効化については告知がない。たぶんサーバー管理会社の方針でおこなったものではないかと思う。
SSL/TLS1.0の脆弱性は以前から指摘されており、無効化の期限が切られている。
脆弱なSSLおよびTLSからの移行期限の変更について | NTTデータ先端技術株式会社
SSL/TLS 1.0 はいつまでに無効化しなければならないか? | NTTデータ先端技術株式会社
大手のサーバーは軒並み2018年6月をめどにTLS1.0を無効化する見込みで、青空文庫も追従することは仕方ないかもしれない。
問題は既存のアプリへの影響で、iOSiOS5以降TLS1.1/1.2に対応しているが、Androidの場合はTLS1.1/1.2に標準で対応するのは5.0(Lollipop)以降である。
実は4.1〜4.4はTLS1.1/1.2が既定で無効化されているだけなので、アプリ側の対応でTLSを有効にすれば回避できる。
この辺の事情については次が参考になる。
Android4系端末のTLS1.1&1.2対応について
https://qiita.com/ntsk/items/9f31fc7b44c04ea45e0b

具体的な実装は下記の通りで、OkHttpClientを使っている場合は比較的簡単に対応できる。
Android 4系(API16-19)のTLS1.1, 1.2対応 - 怠惰を求めて勤勉に行き着く
support enabling TLSv1.2 on Android 4.1-4.4. #2372
https://github.com/square/okhttp/issues/2372

AndroidでHTTP通信の方法について

AndroidでHTTP通信を行う方法には変遷がある。
最初はHttpClientが標準だったが、Android5.1から非推奨になり、現在はHttpURLConnectionが標準ということになっている。
一時期Volleyが流行った時期があったが、HTTPClientに依存しているために現在は非推奨になってしまった。
HttpURLConnectionにも標準ではリダイレクトに対応していないという問題があって、リダイレクトさせるには自分で色々実装が必要になる。
[Android]URLConnectionでリダイレクトにも対応してみた | T.Muroiのblog
サードパーティー製でOkHttpClientというのがあり、こちらはリダイレクトにも対応していて活発に更新されているので、今はOkHttpClientを使っているアプリが多いと思う。
読書尚友ではHttpURLConnectionを使っていたが、kitkat以下の場合はOkHttpClientを使って上記の方法でTLSを有効にすることで、なんとかAndroid4.1-4.4でも青空文庫からダウンロードできるようにした。

Android4.0.3以下については、どうあがいても青空文庫サーバーから直接ダウンロードすることはできない。実際、端末のブラウザから青空文庫ホームページを見ることすらできない。

TLS1.0の無効化がすすむと、古いAndroid端末は実用的には使えなくなると思う。Yahoo! JAPANも6/1以降TLS1.0/1.1のサポートを順次終了するとアナウンスしており、「見られるホームページがほとんどない」という事態になるはずだ。
読書尚友の有償版では別のサーバーからの一括ダウンロードができるので、現在までに公開されている作品については一括ダウンロードで読むことが可能である。
だが作品一覧のデータの取得ができないので、新規作品を読めない。作品一覧をミラーサーバに置くとかすれば対応できる可能性があるが、今後メンテしていけるかどうかが不透明だ。
miniSDKVersionを16(4.1Jelly Bean)にして、4.0.3以下は切り捨てることも考えないといけないかもしれない。4.0.3以下の端末で読書尚友を利用しているユーザがまだ2%くらいいるので、悩ましいところだ。