6

[已解决] - 见下文

在 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:显然,将来经过验证的证书不会被接受。

4

1 回答 1

0

正如 Arcshade 所说。

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

于 2013-11-12T19:56:35.340 回答