アプリケーションにクライアント証明書が埋め込まれた Web ビューを何日も使用しようとしましたが、Android SDK にはそれを行う方法がないように思えます。サーバーから送信されたチャレンジをインターセプトするコールバックはありますか? クライアント証明書で webview を使用して https 要求を行う方法はありますか?
8 に答える
私もあなたの問題に興味があるので、WebView と WebViewClient のドキュメントをチェックし、サーフィンをしましたが、実際にはクライアント証明書を使用して WebView セッションを認証できないようです。必要なメソッド (ClientCertRequestHandler) はパブリック API。
Android WebView を使用してクライアント証明書で安全なサーバーに接続する
Android Security Discussions を検索すると、呼び出しが実際に利用できないことが確認されます。
https://groups.google.com/forum/#!msg/android-security-discuss/0hzTGaA9swQ/1Oqc8UpGLH8J
とはいえ
Android 4.0 リリースには、ブラウザーでのクライアント証明書認証のサポートが含まれています。
(参照: https://code.google.com/p/android/issues/detail?id=8196 )
WebViewsについては言及されていません:(
キーチェーンに証明書をロードするための新しい API がいくつかありますが:
http://developer.android.com/reference/android/security/KeyChain.html http://nelenkov.blogspot.it/2011/11/using-ics-keychain-api.html
WebView がそれらを使用するかどうかは明確ではありません... したがって、KeyChain クラスを試して、正しく認証できるかどうかを確認する必要があると思います (これをテストする簡単な方法がないため、自分で行ってください)。
KeyChain が WebViews で機能しない場合、完璧な回避策とはほど遠いいくつかの方法に要約されると思います。
解決策 1:
とにかくClientCertRequestHandlerを使用します(非表示としてマークされていますが、明らかにまだ使用可能です):
https://code.google.com/p/android/issues/detail?id=53491
しかし、仮に作ったとしても、Android Dev. チームは通知なしにメソッドを変更/削除する可能性があり、アプリは SO の将来のリリースで動作しなくなる可能性があります。
解決策 2:
ターゲットを Android 4.0 以降に制限できる場合、大胆な (そしてありそうもない...) 解決策は、ファイル スキームを使用して、ローカル ストレージから webview に証明書を読み込もうとすることです。
ローカル HTML ファイルを WebView にロードする
しかし、ブラウザと同じようにwebviewが動作することを強く疑っています...
解決策 3: (動作するはずですが、多くの労力が必要です)
HTTPClient または HttpURLConnection を使用してバックグラウンドですべての https 接続を処理し、データを WebView に渡します。
http://chariotsolutions.com/blog/post/https-with-client-certificates-on/
あなたは私の同情を持っています。
API 21 (Android Lollipop) 以降では、 WebViewClient.onReceivedClientCertRequest(WebView view, ClientCertRequest request)をオーバーライドできます。このメソッドでは、キー マネージャーを使用して秘密鍵と証明書チェーンを取得し、request.proceed()を呼び出します。
Web ビュー内で ssl 証明書の要求を無視する必要がある場合、これは Lollipop でうまくいきました。
Web ビュー クライアント内で、以下を上書きします。
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}
これは、qa/dev/stage 環境に対する Web ビューのデバッグに役立ちます。
SSL 証明書の検証を適切に処理して、更新されたセキュリティ ポリシーに従ってアプリが Google Play から拒否されるのを防ぐには、コードを変更して、サーバーによって提示された証明書が期待どおりである場合は常に SslErrorHandler.proceed() を呼び出し、それ以外の場合は SslErrorHandler.cancel() を呼び出します。
たとえば、ユーザーに確認させるアラート ダイアログを追加すると、Google が警告を表示しなくなったようです。
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
String message = "SSL Certificate error.";
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
message = "The certificate authority is not trusted.";
break;
case SslError.SSL_EXPIRED:
message = "The certificate has expired.";
break;
case SslError.SSL_IDMISMATCH:
message = "The certificate Hostname mismatch.";
break;
case SslError.SSL_NOTYETVALID:
message = "The certificate is not yet valid.";
break;
}
message += " Do you want to continue anyway?";
builder.setTitle("SSL Certificate Error");
builder.setMessage(message);
builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.proceed();
}
});
builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
handler.cancel();
}
});
final AlertDialog dialog = builder.create();
dialog.show();
}
この変更後、警告は表示されません。
Android 4.4 の Chronium ベースの WebView にバグが導入されました。サーバーがクライアント証明書を要求すると、WebView はロード プロセスを停止します。onPageFinished -Methodがすぐに呼び出されますが、ページは表示されません。
--> https://code.google.com/p/android/issues/detail?id=62533
WebView でクライアント証明書にアクセスできません。Google の問題が発生しています。 https://code.google.com/p/android/issues/detail?id=53491
API 21 以降、onReceivedClientCertRequest() が WebViewClient に追加されました 。
次の Stackoverflow 投稿の解決策は私にとってはうまくいきました: Android WebView handle onReceivedClientCertRequest
テストする:
- サーバー URL: https://client.badssl.com/
- クライアント証明書: https://badssl.com/download/
クライアント証明書が設定されていない場合、「400 bad request」が表示されます。
自己署名 SSL 証明書が機能しています
この回答を確認してくださいhttps://stackoverflow.com/a/49003522/5058630