2016-04-17 4 views
0

Мой Android приложение сообщает мне, что мой сертификат HTTPS не соответствует имени хоста:javax.net.ssl.SSLException: имя хоста в сертификате не соответствует

javax.net.ssl.SSLException: hostname in certificate didn't match: <hostname1> != <oldhostname> 

Что нечетное является то, что

  1. сайт (hostname1) дает правильный сертификат (проверено с браузерами и инструмент ssllabs)
  2. oldhostname является предыдущее имя хоста я создал в предыдущих версиях приложения

Есть ли какой-то кеш для сертификатов? Я cant't найти любую информацию по этому

+0

Вы уверены, что используете код с URL-адресом, используя 'hostname1' вместо' oldhostname'? Ваши симптомы будут соответствовать случаю, когда ваш Java-код по-прежнему использует «oldhostname». – CommonsWare

+0

Это может быть проблема с неправильным URL-адресом, и в этом случае вы получите аналогичную ошибку в браузере. Или это проблема с SNI, см. Http://stackoverflow.com/questions/5879894/android-ssl-sni-support. –

+0

Да, я уверен, что URL-адрес верен. Я уверен, что Штеффен прав, я очень быстро взглянул на SNI/Android некоторое время назад, и я понял, что для чего-то выше 2.x все в порядке. Похоже, я неправильно понял, что я читаю, я потрачу время, чтобы полностью прочитать ссылку. Большое спасибо Steffen –

ответ

0

Добавить этот класс

public class HttpsTrustManager implements X509TrustManager { 
    private static TrustManager[] trustManagers; 
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[]{}; 

    @Override 
    public void checkClientTrusted(
      X509Certificate[] x509Certificates, String s) 
      throws java.security.cert.CertificateException { 
    } 

    @Override 
    public void checkServerTrusted(
      X509Certificate[] x509Certificates, String s) 
      throws java.security.cert.CertificateException { 
    } 

    public boolean isClientTrusted(X509Certificate[] chain) { 
     return true; 
    } 

    public boolean isServerTrusted(X509Certificate[] chain) { 
     return true; 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return _AcceptedIssuers; 
    } 

    public static void allowAllSSL() { 
     HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 

      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return true; 
      } 

     }); 

     SSLContext context = null; 
     if (trustManagers == null) { 
      trustManagers = new TrustManager[]{new HttpsTrustManager()}; 
     } 

     try { 
      context = SSLContext.getInstance("TLS"); 
      context.init(null, trustManagers, new SecureRandom()); 
     } catch (NoSuchAlgorithmException | KeyManagementException e) { 
      e.printStackTrace(); 
     } 

     HttpsURLConnection.setDefaultSSLSocketFactory(context != null ? context.getSocketFactory() : null); 
    } 
} 

и вызвать его из MainActivity с HttpsTrustManager.allowAllSSL();

Хотя это не спасает подход, но я решить мою проблему с этим.

+0

С таким «обходным решением» вас приветствует в клубе небезопасных приложений, см. Https://www.fireeye.com/blog/threat-research/2014/08/ssl-vulnerabilities-who-listens -when-android-applications-talk.html или http://www2.dcsec.uni-hannover.de/files/android/p50-fahl.pdf. –

+0

@SteffenUllrich Да, я упоминаю об этом в своем ответе, что «это не сберегательный подход», если у вас есть хороший подход, дайте нам знать. – Umar

+0

Правильный подход - сначала выяснить причину ошибки, а затем исправить причину, а не просто игнорировать проблему, отключив проверку сертификата. –

Смежные вопросы