Проверяет ли X509TrustManager запросы API только один раз за Android сеанс приложения? - PullRequest
0 голосов
/ 04 февраля 2020

Недавно я реализовал функцию безопасности, чтобы проверить, связан ли мой запрос с действительным хостом. Для этого я проверяю сертификаты этого хоста и использую X509TrustManager для этого случая. Поэтому, если X509TrustManager обнаружит недействительный сертификат, он выдаст исключение, и в соответствии с этим я покажу пользователю предупреждение. Но проблема в том, что X509TrustManager выдает исключение только в первый раз. Но когда я повторил sh тот же запрос, я не уловил недействительную сертификацию и не увидел ни одного предупреждения. Ниже я добавил свою реализацию. Сообщите мне любую проблему с моей реализацией или любую известную проблему с X509TrustManager. Спасибо и всего наилучшего.

final X509TrustManager finalTrustManager = x509TrustManager;
    TrustManager[] trustAllCerts = new TrustManager[0];
    if (finalTrustManager != null) {
        trustAllCerts = new TrustManager[]{
                new X509TrustManager() {

                    public X509Certificate[] getAcceptedIssuers() {
                        return finalTrustManager.getAcceptedIssuers();
                    }

                    @Override
                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        try {
                            // If Application get any CertificateException in Splash screen we will show related alert in MainActivity
                            // We need to terminate app after showing alert but if we show alert in Splash screen it will get hide when Main Activity get visible.
                            // To avoid this scenario we added this implementation.
                            if (mIsSplashGetInvalidateCertificate && !(mLifecycleManager.getCurrentStackOfActivity().get(0) instanceof SplashActivity)) {
                                mAlertManager.showAlertMessageWithoutDuplicates(mLifecycleManager.getCurrentContext().getResources().getString(R.string.certificate_error_title), mLifecycleManager.getCurrentContext().getResources().getString(R.string.certificate_error_message), (FragmentActivity) mLifecycleManager.getCurrentStackOfActivity().get(0), true);
                            }

                            // Checking the certificate availability of host
                            if ((certs != null && certs.length != 0) && (authType != null && authType.length() != 0)) {
                                finalTrustManager.checkClientTrusted(certs, authType);
                            } else {
                                terminateApplicationWithAlert();
                            }
                        } catch (CertificateException e) {
                            terminateApplicationWithAlert();
                        }
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        try {
                            if (mIsSplashGetInvalidateCertificate && !(mLifecycleManager.getCurrentStackOfActivity().get(0) instanceof SplashActivity)) {
                                mAlertManager.showAlertMessageWithoutDuplicates(mLifecycleManager.getCurrentContext().getResources().getString(R.string.certificate_error_title), mLifecycleManager.getCurrentContext().getResources().getString(R.string.certificate_error_message), (FragmentActivity) mLifecycleManager.getCurrentStackOfActivity().get(0), true);
                            }

                            if ((certs != null && certs.length != 0) && (authType != null && authType.length() != 0)) {
                                finalTrustManager.checkServerTrusted(certs, authType);
                            } else {
                                terminateApplicationWithAlert();
                            }
                        } catch (CertificateException e) {
                            terminateApplicationWithAlert();
                        }
                    }
                }
        };
    }

1 Ответ

1 голос
/ 04 февраля 2020

Вы на самом деле не помечаете сертификат как недействительный, потому что вы ловите CertificateException и глотаете его. Не выбрасывая CertificateException, вы сообщаете библиотеке HTTP, что недействительный сертификат действителен, который он, вероятно, кэширует, чтобы не повторять проверку сертификата слишком много раз.

Вам необходимо разрешить CertificateException быть выброшенным из методов X509TrustManager, перехватить ошибку на сайтах HTTP-вызовов и показать там диалог.

...