WebViewでSSLを利用するAndroidアプリを
Google Play Developer Consoleにて公開したところアラートが発生した。
アラートの内容を一部抜粋する。
アプリに安全に実装されていない WebViewClient.onReceivedSslError ハンドラがあります。
具体的には、この実装ではすべての SSL 証明書の確認エラーが無視され、
アプリが中間者攻撃に対して脆弱になっています。
片言の日本語ではあるが、何が言いたいのかは一瞬でわかった。
今回、公開したアプリは、WebViewでオレオレ証明書を持つサーバと暗号化通信するために、
SSLエラーを無視する処理を入れている。
コードを以下に示す。
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
handler.proceed();
}
});
上記コードを入れていれば、SSLエラーが起きても無視して続行するようになるが、
このコードに関して、Googleからアラートという形で注意を受けた。
Googleはオレオレ証明書の使用を禁止しているのか?と思い、
アラートの内容をよく読むと以下のようにも書いてある。
SSL 証明書の確認を適切に処理するには、サーバーから提示された証明書が
条件を満たしている際には常に SslErrorHandler.proceed() を呼び出し、
それ以外の場合には SslErrorHandler.cancel() を呼び出すようにコードを変更してください。
つまり、無条件で許可するなと言っている。
そこで以下のようにコードを修正し、アプリのアップデートをかけたところ、
アラートはなくなった。
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
if(error.getPrimaryError() != SslError.SSL_UNTRUSTED){
handler.cancel();
}
else{
handler.proceed();
}
}
}
});
SslErrorには、SSLエラーの内容が含まれている。
証明書がオレオレで信用できない場合、
エラーコードがSslError.SSL_UNTRUSTEDとなる。
それ以外のエラーが発生した場合にだけ、
サーバへの接続を中止するように変更している。
【補足】
インターネットから接続されるサーバでかつ重要なデータを扱う場合は、
CAにて認証された証明書を利用すべきであり、オレオレ証明書の使用は望ましいものではない。
当方のサーバでは、接続を特定のクライアントのみが可能なようにしている。
また、さほど重要なデータを扱っていないが、HTTPだと通信が丸見えで、
気持ち悪いのでHTTPSが使いたかったという経緯がある。
このような場合に、わざわざCAの認証を通した証明書を利用するまでもないと考え、
プライベートCAを導入し、いわゆるオレオレ証明書を使用している。
コメント