Метод onReceivedClientCertRequest в Android WebViewClient вызывается только один раз - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь выполнить двустороннюю аутентификацию 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...