android-webview - 带证书的 Android 4.0 Webview SSL 身份验证

标签 android-webview android-4.0-ice-cream-sandwich

我试图在需要 ssl 身份验证的 web View 中查看 https url。
我有一个与这篇文章类似的问题:
How to handle Basic Authentication in WebView
我收到 401 未经授权的错误。

我不希望用户在使用证书进行身份验证时输入用户名或密码。
我通过两种方式获得了客户端证书,作为使用 keystore 的 X509Certificate 和作为 bks keystore 。

任何人都可以帮助我如何在加载 url 时告诉 webview 使用此证书。

最佳答案

代码来自 https://github.com/potaka001/WebViewBasicAuthTest

当然,您对 onReceivedHttpAuthRequest 方法感兴趣。

package com.webviewbasicauthtest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.webkit.CookieManager;
import android.webkit.HttpAuthHandler;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MyWebViewClient extends WebViewClient {
  private String loginCookie;
  private Context mContext;
  private WebView mWebView;
  public MyWebViewClient(Context context, WebView webview) {

  super();
  mContext = context;
  mWebView = webview;
}

@Override
public void onPageStarted( WebView view, String url, Bitmap favicon ) {
}

@Override
public void onPageFinished( WebView view, String url ) {
  CookieManager cookieManager = CookieManager.getInstance();
  cookieManager.setCookie(url, loginCookie);
}

@Override
public void onReceivedError( WebView view, int errorCode, String description, String failingUrl ) {
  Toast.makeText(view.getContext(), "ページ読み込みエラー",   Toast.LENGTH_LONG).show();
}

@Override
public void onLoadResource( WebView view, String url ){
  CookieManager cookieManager = CookieManager.getInstance();
  loginCookie = cookieManager.getCookie(url);
}

@Override
public boolean shouldOverrideUrlLoading( WebView view, String url ) {
  return false;
}

@Override
public void onReceivedSslError( WebView view, SslErrorHandler handler, SslError error ) {
  handler.proceed();
}

@Override
public void onReceivedHttpAuthRequest( WebView view, final HttpAuthHandler handler, final String host, final String realm ){

  String userName = null;
  String userPass = null;

  if (handler.useHttpAuthUsernamePassword() && view != null) {
    String[] haup = view.getHttpAuthUsernamePassword(host, realm);

  if (haup != null && haup.length == 2) {
    userName = haup[0];
    userPass = haup[1];
 }
}

if (userName != null && userPass != null) {
    handler.proceed(userName, userPass);
}
else {
    showHttpAuthDialog(handler, host, realm, null, null, null);
}
}

private void showHttpAuthDialog( final HttpAuthHandler handler, final String host, final String realm, final String title, final String name, final String password ) {
    LinearLayout llayout = new LinearLayout((Activity)mContext);
    final TextView textview1 = new TextView((Activity)mContext);
    final EditText edittext1 = new EditText((Activity)mContext);
    final TextView textview2 = new TextView((Activity)mContext);
    final EditText edittext2 = new EditText((Activity)mContext);
    llayout.setOrientation(LinearLayout.VERTICAL);
    textview1.setText("username:");
    textview2.setText("password:");
    llayout.addView(textview1);
    llayout.addView(edittext1);
    llayout.addView(textview2);
    llayout.addView(edittext2);

    final Builder mHttpAuthDialog = new AlertDialog.Builder((Activity)mContext);

    mHttpAuthDialog.setTitle("Basic Authentication")
    .setView(llayout)
    .setCancelable(false)
    .setPositiveButton("OK", new    DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {
  EditText etUserName = edittext1;
  String userName = etUserName.getText().toString();
  EditText etUserPass = edittext2;
  String userPass = etUserPass.getText().toString();
  mWebView.setHttpAuthUsernamePassword(host, realm, name, password);
  handler.proceed(userName, userPass);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
  public void onClick(DialogInterface dialog, int whichButton) {
  handler.cancel();
}
})
.create().show();
}
}

关于android-webview - 带证书的 Android 4.0 Webview SSL 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12069451/

相关文章:

android - Android 设备重新启动时,Web View 中的 Cookie、本地存储值是否被删除?

android - View 大小的 ICS gui 错误

android - YouTube Intent ,错误 400

安卓浏览器截断https ://scheme from complete qualifier

Android View 在视觉上处于正常位置,但实际上 - 在 TranslateAnimation 之后的起始位置

安卓权限 WRITE_APN_SETTINGS

Android 4.x Web View 主题标签

android - 如何让按钮出现在 CoordinatorLayout 内的 WebView 下方

android - 在 WebView 中拦截 "file:"scheme 请求

javascript - 在Android的WebView中, `DomStorage` 、 `Database` 、 `AppCache` 之间有什么不同?