[已解决] - 见下文
在 Android 2.2 通过 HTTPS 连接尝试从启用了 REST 的 WCF 服务中获取一些 JSON 数据时,我遇到了异常。然后我注意到发生了一些非常奇怪的事情。在我的手机上运行应用程序时,它运行良好,它会返回漂亮的 JSON 数据。但是,在我的模拟器上运行应用程序时,一旦执行“httpclient.execute(request)”,它就会崩溃,并给出 SLLException: no peer certificate。这特别奇怪,因为我的 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();
现在我已经尝试寻找解决方案,但是基本上没有解决方案适合这种情况。
[解决方案]
自从我编辑主机文件以来,我的模拟器正在运行快照,因此我不需要在 DNS 中设置我的服务。现在问题来了,因为我每次都通过快照运行它。日期设置为 2012 年 10 月 24 日,模拟器中的时间为 18:48。然后我意识到我验证证书的日期是 2012 年 10 月 27 日,时间是 14:45。显然,“从互联网上获取时间”选项在模拟器上不起作用。这使我的 httpclient 抛出“无对等证书”异常,因为它在技术上在模拟器中没有经过验证的证书。可悲的是,当您使用关键字“android”或“https android wcf”搜索此异常的解决方案时,您只会得到与自签名证书有关的问题的人的结果。
TL;DR:显然,将来经过验证的证书不会被接受。