WebViewでオレオレなサーバにアクセスする際の注意点

アプリ開発

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を導入し、いわゆるオレオレ証明書を使用している。

コメント

タイトルとURLをコピーしました