Исключение SSL-подтверждения на некоторых устройствах [дубликат]

Простыми словами,

НЕ ДЕЛАЙТЕ СЕТЕВЫЕ РАБОТЫ В РЕЖИМЕ UI

Например, если вы выполняете HTTP-запрос, это сетевое действие.

Решение:

  1. Вы должны создать новую тему
  2. Или использовать класс AsyncTask

Путь:

Поместите все ваши работы внутри

  1. run() метода нового потока
  2. Или doInBackground() метода класса AsyncTask.

Но:

Когда вы получаете что-то из ответа сети и хотите показать его на своем экране (например, сообщение с ответом на отображение в TextView), вам нужно вернуться обратно в пользовательский интерфейс thread.

Если вы этого не сделаете, вы получите ViewRootImpl$CalledFromWrongThreadException.

Как?

  1. При использовании AsyncTask, просмотр обновления из метода onPostExecute()
  2. Или вызовите метод runOnUiThread() и обновите внутри метода run().

11
задан jdphenix 21 March 2014 в 07:08
поделиться

1 ответ

Обновления: - Я никогда не был экспертом в этом вопросе, следующее является лишь обходным решением и может быть небезопасным, используйте его на свой страх и риск. Это сообщение старше 3 лет, поэтому он может быть устаревшим теперь (код не будет компилироваться), но вы должны найти возможность найти обновленный подход или официальные документы, говорящие, что некоторые части устарели или удалены.

Благодарите noloader за указание на меня в направлении коррекции. Я решил решить эту проблему, используя следующее:

String keyStoreType = KeyStore.getDefaultType();
            KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(null, null);
            keyStore.setCertificateEntry("ca", ca);// my question shows how to get 'ca'
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
    TrustManagerFactory.getDefaultAlgorithm());
// Initialise the TMF as you normally would, for example:
tmf.init(ca); 

TrustManager[] trustManagers = tmf.getTrustManagers();
final X509TrustManager origTrustmanager = (X509TrustManager)trustManagers[0];

TrustManager[] wrappedTrustManagers = new TrustManager[]{
   new X509TrustManager() {
       public java.security.cert.X509Certificate[] getAcceptedIssuers() {
          return origTrustmanager.getAcceptedIssuers();
       }

       public void checkClientTrusted(X509Certificate[] certs, String authType) {
           origTrustmanager.checkClientTrusted(certs, authType);
       }

       public void checkServerTrusted(X509Certificate[] certs, String authType) {
           try {
               origTrustmanager.checkServerTrusted(certs, authType);
           } catch (CertificateExpiredException e) {}
       }
   }
};

SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, wrappedTrustManagers, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());  

Из 3 сертификатов, найденных для сайта, упомянутых в моем вопросе, тот, который работал для меня, был VeriSign Class 3 Secure Server CA - G3

3
ответ дан ericn 27 August 2018 в 05:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: