2016-04-17 21 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はは、私が設定していた以前のホスト名で提供します以前のバージョンのアプリケーションでは

証明書用のキャッシュはありますか?私はその

+0

'oldhostname'ではなく' hostname1'を使ってURLを持つコードを実行していますか?あなたの症状は、あなたのJavaコードがまだ 'oldhostname'を使用している場合に適合します。 – CommonsWare

+0

これは間違ったURLの問題で、ブラウザで同様のエラーが発生する可能性があります。または、SNIの問題です。http://stackoverflow.com/questions/5879894/android-ssl-sni-supportを参照してください。 –

+0

はいURLが正しいと確信しています。私はむしろSteffenが正しいことを確信しています。私はSNI/Androidを少し前に見ていましたが、私は2.x以上のものはOKでした。私が読んだことを誤解したように見えますが、私はリンクを徹底的に読むために時間をかけます。ありがとう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); 
    } 
} 

このクラスを追加し、それはアプローチを保存するが、私はこれで私の問題を解決していないですがHttpsTrustManager.allowAllSSL();

であなたのMainActivityからそれを呼び出す上の任意の情報を見つけるcant't。

+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

正しい方法は、エラーの原因を最初に見つけて、証明書の検証を無効にするだけで問題を無視するのではなく、原因を修正することです。 –

関連する問題