Socket接続を使用しているAndroidアプリを公開したところリジェクトされたので、その時のメモを残しておきます。
Socket接続を以下のように行っていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new SecureRandom()); IO.setDefaultSSLContext(sc); HttpsURLConnection.setDefaultHostnameVerifier(new RelaxedHostNameVerifier()); IO.Options opts = new IO.Options(); opts.forceNew = true; opts.reconnection = true; opts.secure = true; opts.sslContext = sc; socket = IO.socket(BuildConfig.CHAT_URL,opts); } catch (KeyManagementException e) { e.printStackTrace(); }catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } |
1 2 3 4 5 |
public static class RelaxedHostNameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } |
テストを行い正しく接続できたので公開を行ったところ、「HostnameVerifier の脆弱性の問題」でリジェクトされました。
回避方法のリンク先には以下のように記載がありました。
1 2 3 4 5 6 7 |
HostnameVerifier の脆弱性の問題を回避する方法 この情報は、実装が安全でない HostnameVerifier インターフェースをアプリで使用しているデベロッパーを対象としています。 このインターフェースでは、setDefaultHostnameVerifier API でリモートホストに HTTPS 接続する際にすべてのホスト名を許可してしまうため、アプリが中間者攻撃を受けやすくなります。攻撃者は、送信データ(ログイン認証情報など)を読み取ったり、HTTPS 接続で送信されたデータを変更したりする可能性があります。 状況 2017 年の 3 月 1 日以降、Google Play では実装が安全でない HostnameVerifier を使用するすべての新規アプリおよびアップデートの公開がブロックされるようになりました。詳しくは Play Console の通知をご覧ください。Play Console に表示されている期限を過ぎた後もセキュリティの脆弱性が修正されていないアプリは、Google Play から削除される可能性があります。 |
以下部分で常にtrueを返していることが問題でした。
1 2 3 4 5 |
public static class RelaxedHostNameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } |
以下のようにhostnameのチェックを行うように修正することによりリジェクトを回避できました。
1 2 3 4 5 |
public static class RelaxedHostNameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return BuildConfig.CHAT_HOST.equalsIgnoreCase(hostname); } } |
昔はandroidアプリはほとんどリジェクトされませんでしたが、androidアプリの審査も厳しくなっています。
以上です。