的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:显然在将来验证的证书不会被接受。
正如Arcshade所述。
我编辑主机文件后,仿真程序正在运行快照,因此我不需要在DNS中设置服务。现在这里出现了,因为我每次都在快照中运行它。日期设定为2012年10月24日,模拟器中的时间为18:48。然后我意识到我验证证书的日期是2012年10月27日14:45。显然,“从互联网上获得时间”选项不适用于模拟器。这使得我的httpclient抛出了“无对等证书”异常,因为它在技术上没有仿真器中的验证证书。可悲的是,当您使用关键字“android”或“https android wcf”搜索此异常的解决方案时,您只会得到与自签名证书有关的问题的结果。
很高兴自己找到这个。我倾向于在你的_“显然”_中看到一些混淆,但这是合乎逻辑的:证书从X到Y都是有效的。如果当前时间根据特定机器在该时间段之外,证书在该机器上被认为是无效的。 – CodeCaster
您应该回答您的问题并将其标记为已回答 – alkis