[解決] - 見下面的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:顯然在將來驗證的證書不會被接受。
很高興自己找到這個。我傾向於在你的_「顯然」_中看到一些混淆,但這是合乎邏輯的:證書從X到Y都是有效的。如果當前時間根據特定機器在該時間段之外,證書在該機器上被認爲是無效的。 – CodeCaster
您應該回答您的問題並將其標記爲已回答 – alkis