2012-11-01 45 views
6

[解決] - 見下面的Android - HTTPS連接到.NET WCF服務提供了異常SSLException:「沒有同行證書」

我已經得到試圖從我的REST一些JSON數據啓用WCF異常時通過HTTPS連接在Android 2.2中提供服務。然後我發現了一些非常奇怪的事情。 在我的手機上運行應用程序時,它運行得非常好,它會得到美麗的JSON數據。但是,當我在模擬器上運行應用程序時,一旦執行「httpclient.execute(request)」,它就會崩潰,並提供SLLException:無對等證書。 這很奇怪,因爲我的WCF服務有一個有效的RapidSSL簽名證書(CA)。另外,我確保我的IIS中不需要客戶端證書。 (另外這個功能並沒有在UIThread運行!它是在一個單獨的線程運行。)

我的代碼:

public Object getJSON(String URL, HashMap<String, String> parameters, String METHOD, String TAG) { 
    try { 
     this.TAG = TAG; 
     // Send GET request to <service>/METHOD?params 
     //Target API(8) for AndroidHttpClient and Target API(5) for DefaultHttpClient 
     AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); 
     String params = "?"; 
     if(parameters != null){ 
      for (Entry<String, String> para : parameters.entrySet()) { 
       params = params + (String)para.getKey() + "=" + (String)para.getValue() + "&"; 
      } 
      params = params.substring(0, params.length() - 1); 
      Log.i("U's n P's", params);//Username and password check 
     } 

     HttpGet request = new HttpGet(URL + METHOD + params); 
     Log.i(TAG, request.getRequestLine().toString()); 
     request.setHeader("Accept", "application/json"); 
     request.setHeader("Content-type", "application/json"); 
     HttpResponse response = client.execute(request);//Crashes here 
     HttpEntity responseEntity = response.getEntity(); 

     // Read response data into buffer 
     char[] buffer = new char[(int)responseEntity.getContentLength()]; 
     InputStream stream = responseEntity.getContent(); 
     InputStreamReader reader = new InputStreamReader(stream); 
     reader.read(buffer); 
     stream.close(); 

現在,我已經嘗試尋找一個解決方案,但是基本無解符合這種情況。

[解決方法]

我的模擬器通過快照運行,因爲我編輯的hosts文件,所以我並不需要設置我的服務了一個DNS。現在這裏出現了,因爲我每次都在快照中運行它。日期設定爲2012年10月24日,模擬器中的時間爲18:48。然後我意識到我驗證證書的日期是2012年10月27日14:45。顯然,「從互聯網上獲得時間」選項不適用於模擬器。這使得我的httpclient拋出了「無對等證書」異常,因爲它在技術上沒有仿真器中的驗證證書。可悲的是,當您使用關鍵字「android」或「https android wcf」搜索此例外的解決方案時,您只能獲得與自簽名證書有關的問題的人的結果。

TL; DR:顯然在將來驗證的證書不會被接受。

+0

很高興自己找到這個。我傾向於在你的_「顯然」_中看到一些混淆,但這是合乎邏輯的:證書從X到Y都是有效的。如果當前時間根據特定機器在該時間段之外,證書在該機器上被認爲是無效的。 – CodeCaster

+3

您應該回答您的問題並將其標記爲已回答 – alkis

回答

0

正如Arcshade所述。

我編輯主機文件後,仿真程序正在運行快照,因此我不需要在DNS中設置服務。現在這裏出現了,因爲我每次都在快照中運行它。日期設定爲2012年10月24日,模擬器中的時間爲18:48。然後我意識到我驗證證書的日期是2012年10月27日14:45。顯然,「從互聯網上獲得時間」選項不適用於模擬器。這使得我的httpclient拋出了「無對等證書」異常,因爲它在技術上沒有仿真器中的驗證證書。可悲的是,當您使用關鍵字「android」或「https android wcf」搜索此異常的解決方案時,您只會得到與自簽名證書有關的問題的結果。

相關問題