Я пытаюсь выполнить двустороннюю аутентификацию mTls на Android с помощью WebView. Я установил свой сертификат клиента в брелок 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 вызывается только один раз, в первый раз. Это не называется после. Я должен перезагрузить устройство, чтобы снова запросить сертификат клиента. В документации также говорится, что
" Webview сохраняет ответ в памяти (на весь срок службы приложения), если вызывается ClientCertRequest # continue или ClientCertRequest # cancel, и он не вызывает onReceivedClientCertRequest () снова для той же пары хоста и порта. «
Моя проблема в том, что если пользователь выбирает неправильный сертификат в первый раз, WebView будет продолжать использовать его после этого. Метод mWebView.clearSslPreferences (); , похоже, не очищает sslContext.
Есть ли способ забыть выбор сертификата пользователя в случае возникновения ошибки SSL?