2013-01-11 105 views
2

我們的Android應用程序指的是HTTP URL從服務器獲取一些數據。它工作正常,直到2天前,但突然我們得到"sslpeerunverifiedexception: no peer certificate" exception,而我們的代碼和服務器都沒有發生變化。代碼很簡單:DefaultHttpClient獲取HTTP請求的SSL異常

HttpParams httpParameters = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(httpParameters, 12000); 
HttpConnectionParams.setSoTimeout(httpParameters, 12000); 
HttpClient client = new DefaultHttpClient(httpParameters); 
HttpGet request = new HttpGet("http://site.com"); 
HttpResponse httpResponse = client.execute(request); 
+0

請提供logcat的詳細信息。 – URAndroid

+0

1)URL與http或https? 2)本地主機或實時網址? –

+0

我想你的網址已經改爲https了,爲此你需要添加對等證書並設置主機名驗證等。 –

回答

0

聽起來您正在訪問的服務器正在使用自簽名SSL證書。

儘管不推薦(可能是MiM攻擊),但您可以忽略它。看到這篇文章的更多信息:Self-signed SSL acceptance on Android

1

在您的代碼中添加以下功能。

public HttpClient getNewHttpClient() throws SocketException, UnknownHostException { 
    try { 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null, null); 

     SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
     sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", sf, 443)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 
     return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
     return new DefaultHttpClient(); 
    } 
} 

並使用下面的代碼調用上述函數。

HttpClient httpclient = getNewHttpClient(); 
+0

我試着類似這樣的代碼,忽略SSL異常,但我得到eclipse錯誤「SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER」無法解析或不是字段 – kazemipouya

+0

@kazemipouya這是你的目標sdk和min sdk? –

+0

分鐘和目標的順序14,16。 – kazemipouya