Android WebViewClient 中的 onReceivedClientCertRequest 方法仅调用一次

问题描述 投票:0回答:1

我正在使用 WebView 在 Android 上尝试双向 mTls 身份验证。我在 Android 钥匙串中安装了客户端证书,并重写了 onReceivedClientCertRequest 方法,如下所示,以从 Android 钥匙串获取客户端证书:

@Override
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void onReceivedClientCertRequest(WebView view, ClientCertRequest request) {
    Log.d("MC-999","onReceivedClientCertRequest");
    Log.d("MC-999", request.getHost());
    Log.d("MC-999", request.getPrincipals()[0].getName());
    ((WebViewActivity) mContext).selectClientCert(request);
}


@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void selectClientCert(ClientCertRequest request) {
    Log.d("MC-999","Select client cert.");
    mRequest = request;
    KeyChain.choosePrivateKeyAlias(this,
        this, // Callback
        request.getKeyTypes(), 
        request.getPrincipals(), // issuers.
        request.getHost(), // host
        request.getPort(), // port
        "");
}

@Override
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void alias(@Nullable String alias) {
    if (alias != null) {
        X509Certificate[] certChain = getCertificateChain(alias);
        PrivateKey privateKey = getPrivateKey(alias);
        mRequest.proceed(privateKey, certChain);
    } else {
        mRequest.ignore();
    }
}

问题: onReceivedClientCertRequest 方法仅在第一次调用一次。此后不再调用它。我必须重新启动设备以确保再次请求客户端证书。该文档还指出

如果调用 ClientCertRequest#proceed 或 ClientCertRequest#cancel,Webview 将响应存储在内存中(在应用程序的生命周期内),并且不会针对同一主机和端口对再次调用 onReceivedClientCertRequest()。

我的问题是,如果用户第一次选择了错误的证书,WebView 此后会继续使用它。方法 mWebView.clearSslPreferences(); 似乎没有清除 sslContext。

有没有办法在遇到 SSL 错误时忘记用户的证书选择?

android ssl android-webview client-certificates
1个回答
0
投票

只需使用

WebView.clearClientCertPreferences
方法即可。这是静态方法。我遇到了和你一样的问题,这个方法对我来说很有效!

© www.soinside.com 2019 - 2024. All rights reserved.