2013-01-11 64 views
2

我们的Android应用程序指的是HTTP URL从服务器获取一些数据。它工作正常,直到2天前,但突然我们得到"sslpeerunverifiedexception: no peer certificate" exception,而我们的代码和服务器都没有发生变化。代码很简单:DefaultHttpClient获取HTTP请求的SSL异常

HttpParams httpParameters = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(httpParameters, 12000); 
HttpConnectionParams.setSoTimeout(httpParameters, 12000); 
HttpClient client = new DefaultHttpClient(httpParameters); 
HttpGet request = new HttpGet("http://site.com"); 
HttpResponse httpResponse = client.execute(request); 
+0

请提供logcat的详细信息。 – URAndroid

+0

1)URL与http或https? 2)本地主机或实时网址? –

+0

我想你的网址已经改为https了,为此你需要添加对等证书并设置主机名验证等。 –

回答

0

听起来您正在访问的服务器正在使用自签名SSL证书。

尽管不推荐(可能是MiM攻击),但您可以忽略它。看到这篇文章的更多信息:Self-signed SSL acceptance on Android

1

在您的代码中添加以下功能。

public HttpClient getNewHttpClient() throws SocketException, UnknownHostException { 
    try { 
     KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     trustStore.load(null, null); 

     SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
     sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

     HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     registry.register(new Scheme("https", sf, 443)); 

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 
     return new DefaultHttpClient(ccm, params); 
    } catch (Exception e) { 
     return new DefaultHttpClient(); 
    } 
} 

并使用下面的代码调用上述函数。

HttpClient httpclient = getNewHttpClient(); 
+0

我试着类似这样的代码,忽略SSL异常,但我得到eclipse错误“SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER”无法解析或不是字段 – kazemipouya

+0

@kazemipouya这是你的目标sdk和min sdk? –

+0

分钟和目标的顺序14,16。 – kazemipouya