Android-Https与.NET WCF服务的连接提供了SSLException:“;“无同行证书”;
[已解决]-见下文 在Android 2.2中,我试图通过HTTPS连接从支持REST的WCF服务获取一些JSON数据时遇到了一个异常。然后我注意到发生了一些非常奇怪的事情。 当在我的手机上运行应用程序时,它工作得很好,并且它会返回漂亮的JSON数据。但是,当在emulator上运行应用程序时,它在执行“httpclient.execute(request)”后立即崩溃,导致SLLException:没有对等证书。 这尤其奇怪,因为我的WCF服务有一个有效的RapidSSL签名证书(CA)。此外,我还确保IIS中不需要客户端证书。(此外,此函数没有在UIThread!上运行,而是在单独的线程上运行。) 我的代码: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)。此外
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。根据某台机器,如果当前时间超出该期限,则该证书在该机器上被视为无效。您应该回答问题并将其标记为已回答