我正在使用 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 错误时忘记用户的证书选择?
只需使用
WebView.clearClientCertPreferences
方法即可。这是静态方法。我遇到了和你一样的问题,这个方法对我来说很有效!