9

クライアント用のアプリのテスト バージョンを作成しています。このアプリの一部は、SSL ベースのサイトを呼び出す WebView を使用します。次に、クライアントは、証明書名が FQDN と一致しないテスト ドメインを提供しました。残念ながら、彼らは一致する証明書をプロビジョニングする立場にありません。:(

私は、コンパニオン iOS アドホック アプリでこの問題を 1 行のコードで回避しています (これも、実稼働用ではなく、テスト目的のためだけです)。私は Android OS で同様の情報を検索しましたが、ここや他の場所で見た解決策は、比較して頭を大きく回転させるのに十分です!

これを回避する簡単な方法はありますか? ユーザー向けの設定でさえ、どこかに隠れていますか?

手がかりに感謝します!

4

2 に答える 2

6

WebViewClient を作成し、次のような onReceivedSslError を処理します。

public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error)

このコールバック内で呼び出すだけhandler.proceed()で、ページの読み込みが続行されます。このコールバックを処理せずにproceed()メソッドを呼び出した場合、デフォルトの動作ではページが読み込まれません。

于 2012-05-12T18:01:43.653 に答える
1

Google の SSL エラー ハンドラに関する新しいセキュリティ ポリシーの更新に従って回答を更新しました。この Android 開発者向けヘルプ センターの記事を参照してください。

悪意のある行為に関するポリシーに違反したことによる Google Play でのアプリケーションの拒否を防ぐため。

SSL 証明書の検証を適切に処理するには、コードを変更して、サーバーによって提示された証明書が期待どおりである場合は常に 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();

}

于 2016-07-15T06:23:27.497 に答える