2015-05-14 60 views
0

美好的一天,可能會徵求意見。 我的代碼工作正常,但有一天沒有明顯的原因,沒有更改服務器上的代碼停止工作,顯示此錯誤 我已檢查鏈接引用的決定,但沒有一個給出了預期的結果。 也許在SSL協議中有一些東西?Android應用程序錯誤:javax.net.ssl.SSLPeerUnverifiedException:沒有同行證書

Safely fixing: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

javax.net.ssl.sslpeerunverifiedexception no peer certificate

Android ssl: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

Trusting all certificates using HttpClient over HTTPS

class RequestTask extends AsyncTask<String, String, String> { 

    @Override 
    protected String doInBackground(String... params) { 

     try { 

      HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; 

      DefaultHttpClient client = new DefaultHttpClient(); 

      SchemeRegistry registry = new SchemeRegistry(); 
      SSLSocketFactory socketFactory = SSLSocketFactory 
        .getSocketFactory(); 
      socketFactory 
        .setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); 
      registry.register(new Scheme("https", socketFactory, 443)); 
      SingleClientConnManager mgr = new SingleClientConnManager(
        client.getParams(), registry); 
      DefaultHttpClient httpClient = new DefaultHttpClient(mgr, 
        client.getParams()); 

      HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 

      ResponseHandler<String> res = new BasicResponseHandler(); 

      HttpPost postMethod = new HttpPost("https://api.equalibra.net/banners.json"); 

      nameValuePairs.add(new BasicNameValuePair("lang", "rus")); 
      postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs, 
        HTTP.UTF_8)); 

      String response = ""; 
      try { 
       response = httpClient.execute(postMethod, res); 
      } catch (Exception e) { 
       Log.d("my", e.toString()); 
      } 

      JSONURL(response); 

     } catch (Exception e) { 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 
} 
+0

主人使用雲賄賂,這個問題可能與雲賄賂的變化有關嗎? –

回答

1

的確,問題在於我的Android SDK不支持SNI。 It helped me:

2

服務器需要使用SNI (server name indication)。不使用SNI的連接只會失敗,而不是通常情況下獲得默認證書。由於這是服務器端的一項設置,它最近可能已更改,因此它破壞了您的代碼。

儘管SNI在更新版本的Apache HTTP客戶端庫中可用,但您可能使用的Android SDK附帶的版本中不提供。

+0

但我的應用程序已經在我的手機上工作 –

+0

再次以防萬一答案不夠清楚:服務器需要*現在* SNI,它可能是它*之前不需要SNI *。這意味着你的應用程序在*服務器端更改之前工作*,但現在不工作*。 –

相關問題