2012-11-01 31 views
6

[SOLVED] - Xem dưới đâyAndroid - Https kết nối đến một NET WCF Service cho SSLException: "Không có giấy chứng nhận ngang hàng"

Tôi đã nhận được một ngoại lệ khi cố gắng để có được một số dữ liệu JSON từ REST của tôi cho phép WCF Dịch vụ, trong Android 2.2 qua kết nối HTTPS. Sau đó tôi nhận thấy có điều gì đó rất lạ xảy ra. Khi chạy ứng dụng trên điện thoại của tôi, nó hoạt động tốt và sẽ lấy lại dữ liệu JSON đẹp. Tuy nhiên, khi chạy ứng dụng trên trình mô phỏng của tôi, nó đã bị hỏng ngay khi "httpclient.execute (yêu cầu)" được thực hiện, đưa ra một SLLException: không có chứng nhận ngang hàng. Điều này đặc biệt lạ vì Dịch vụ WCF của tôi có chứng chỉ đã ký hợp lệ (CA). Thêm vào đó, tôi đã chắc chắn rằng các chứng chỉ Client không cần thiết trong IIS của tôi. (Ngoài ra chức năng này không được chạy trên UIThread !, nó được chạy trên một sợi riêng biệt.)

Mã của tôi:

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(); 

Bây giờ tôi đã cố gắng tìm kiếm một giải pháp, tuy nhiên về cơ bản không có giải pháp trang bị tình trạng này.

[SOLUTION]

giả lập của tôi đã chạy qua một bản chụp kể từ khi tôi thay đổi nội dung các tập tin host vì vậy tôi không cần phải thiết lập dịch vụ của tôi lên trong một DNS. Bây giờ ở đây là bắt, kể từ khi tôi chạy nó thông qua một bản chụp mỗi lần. Ngày được đặt thành ngày 24 tháng 10 năm 2012 với thời gian là 18:48 trong trình mô phỏng. Sau đó tôi nhận ra ngày tôi xác nhận chứng chỉ là ngày 27 tháng 10 năm 2012 với thời gian 14:45. Dường như tùy chọn "nhận thời gian từ internet" KHÔNG hoạt động trên trình giả lập. Điều này làm cho httpclient của tôi ném ngoại lệ "Không có chứng chỉ ngang hàng" vì nó về mặt kỹ thuật không có chứng chỉ được xác thực trong trình mô phỏng. Phần đáng buồn là khi bạn tìm kiếm giải pháp cho ngoại lệ này với từ khóa là "android" hoặc "https android wcf", bạn chỉ nhận được kết quả của những người có vấn đề liên quan đến chứng chỉ tự ký.

TL; DR: Rõ ràng trong các chứng chỉ được xác thực trong tương lai không được chấp nhận.

+0

Rất vui khi bạn tự tìm hiểu điều này. Tôi có xu hướng đọc một số nhầm lẫn trong _ "rõ ràng" _, nhưng nó hợp lý: chứng chỉ hợp lệ từ X cho đến Y. Nếu thời gian hiện tại nằm ngoài khoảng thời gian đó theo một máy nhất định, chứng chỉ được coi là không hợp lệ trên máy đó. – CodeCaster

+3

Bạn nên trả lời câu hỏi của mình và đánh dấu câu hỏi là đã trả lời – alkis

Trả lời

0

Như đã nêu trong Arcshade.

Trình giả lập của tôi đang chạy qua ảnh chụp nhanh vì tôi đã chỉnh sửa tệp máy chủ nên tôi không cần thiết lập dịch vụ của mình trong DNS. Bây giờ ở đây là bắt, kể từ khi tôi chạy nó thông qua một bản chụp mỗi lần. Ngày được đặt thành ngày 24 tháng 10 năm 2012 với thời gian là 18:48 trong trình mô phỏng. Sau đó tôi nhận ra ngày tôi xác nhận chứng chỉ là ngày 27 tháng 10 năm 2012 với thời gian 14:45. Dường như tùy chọn "nhận thời gian từ internet" KHÔNG hoạt động trên trình giả lập. Điều này làm cho httpclient của tôi ném ngoại lệ "Không có chứng chỉ ngang hàng" vì nó về mặt kỹ thuật không có chứng chỉ được xác thực trong trình mô phỏng. Phần buồn là khi bạn tìm kiếm giải pháp cho ngoại lệ này với từ khóa là "android" hoặc "https android wcf", bạn chỉ nhận được kết quả của những người có vấn đề liên quan đến chứng chỉ tự ký.

Các vấn đề liên quan