Android-Https与.NET WCF服务的连接提供了SSLException:“;“无同行证书”;

Android-Https与.NET WCF服务的连接提供了SSLException:“;“无同行证书”;,android,json,wcf,exception,ssl,Android,Json,Wcf,Exception,Ssl,[已解决]-见下文 在Android 2.2中,我试图通过HTTPS连接从支持REST的WCF服务获取一些JSON数据时遇到了一个异常。然后我注意到发生了一些非常奇怪的事情。 当在我的手机上运行应用程序时,它工作得很好,并且它会返回漂亮的JSON数据。但是,当在emulator上运行应用程序时,它在执行“httpclient.execute(request)”后立即崩溃,导致SLLException:没有对等证书。 这尤其奇怪,因为我的WCF服务有一个有效的RapidSSL签名证书(CA)。此外

[已解决]-见下文 在Android 2.2中,我试图通过HTTPS连接从支持REST的WCF服务获取一些JSON数据时遇到了一个异常。然后我注意到发生了一些非常奇怪的事情。 当在我的手机上运行应用程序时,它工作得很好,并且它会返回漂亮的JSON数据。但是,当在emulator上运行应用程序时,它在执行“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();
公共对象getJSON(字符串URL、HashMap参数、字符串方法、字符串标记){ 试一试{ this.TAG=TAG; //向/METHOD?参数发送GET请求 //AndroidHttpClient的目标API(8)和DefaultHttpClient的目标API(5) AndroidHttpClient=AndroidHttpClient.newInstance(“Android”); 字符串参数=“?”; if(参数!=null){ for(条目段:parameters.entrySet()){ params=params+(字符串)para.getKey()+“=”+(字符串)para.getValue()+“&”; } params=params.substring(0,params.length()-1); Log.i(“U'snp's”,params);//用户名和密码检查 } HttpGet请求=新的HttpGet(URL+方法+参数); Log.i(标记,request.getRequestLine().toString()); setHeader(“接受”、“应用程序/json”); setHeader(“内容类型”、“应用程序/json”); HttpResponse response=client.execute(request);//此处崩溃 HttpEntity responseEntity=response.getEntity(); //将响应数据读入缓冲区 char[]buffer=new char[(int)responseEntity.getContentLength()]; InputStream=responseEntity.getContent(); InputStreamReader reader=新的InputStreamReader(流); 读(缓冲区); stream.close(); 现在我试着寻找一个解决方案,但是基本上没有一个解决方案适合这种情况

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

TL;DR:显然,在未来,已验证的证书不会被接受。

如Arcshade所述


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

很高兴您自己发现了这一点。我倾向于在您的“显然”中读到一些困惑,但这是合乎逻辑的:证书的有效期从X到Y。根据某台机器,如果当前时间超出该期限,则该证书在该机器上被视为无效。您应该回答问题并将其标记为已回答