的Android - HTTPS连接到.NET WCF服务提供了异常SSLException:“没有同行证书”

问题描述:

[解决] - 见下面的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

正如Arcshade所述。

我编辑主机文件后,仿真程序正在运行快照,因此我不需要在DNS中设置服务。现在这里出现了,因为我每次都在快照中运行它。日期设定为2012年10月24日,模拟器中的时间为18:48。然后我意识到我验证证书的日期是2012年10月27日14:45。显然,“从互联网上获得时间”选项不适用于模拟器。这使得我的httpclient抛出了“无对等证书”异常,因为它在技术上没有仿真器中的验证证书。可悲的是,当您使用关键字“android”或“https android wcf”搜索此异常的解决方案时,您只会得到与自签名证书有关的问题的结果。