2012-01-08 49 views
2

我有一个Android应用程序,它使用SSLSocketFactory加载pkcs12证书并使用该证书与我的服务器执行SSL客户端认证。此过程在Android 2.1,2.2和2.3上完美工作,但是当我尝试在运行4.0的电话或模拟器上运行此代码时,我的服务器不会从我的应用程序发出的请求中接收到公钥。在Android 4.0中破坏的SSL客户端认证

这里是我用得到我用来执行我的要求

private HttpClient getHttpClient(Context context) { 
    if(httpClient == null) { 
     KeyStore mycert = KeyStore.getInstance("pkcs12"); 
     byte[] pkcs12 = persistentStorage.getPKCS12Certificate(context); 

     ByteArrayInputStream pkcs12BAIS = new ByteArrayInputStream(pkcs12); 
     mycert.load(pkcs12BAIS, config.getPassword().toCharArray()); 

     SSLSocketFactory sockfact = new SSLSocketFactory(mycert, null, null); 

     sockfact.setHostnameVerifier(new StrictHostnameVerifier()); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("https",sockfact , config.getPort())); 

     BasicHttpParams httpParameters = new BasicHttpParams(); 
     HttpProtocolParams.setUseExpectContinue(httpParameters, false); 
     HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1); 

     HttpConnectionParams.setConnectionTimeout(httpParameters, 3000); 
     HttpConnectionParams.setSoTimeout(httpParameters, 3000); 

     ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(httpParameters, registry); 
     cm.closeExpiredConnections(); 
     cm.closeIdleConnections(3000, TimeUnit.MILLISECONDS); 

     httpClient = new DefaultHttpClient(cm, httpParameters); 

    } 

    return httpClient; 
} 
+0

您的应用程序是否崩溃,Logcat出现异常或异常? – yorkw 2012-01-08 22:58:38

回答

1

因此,事实证明,从ICS开始,SSLSocketFactory(或系统的某个其他部分)将不再正确接受未签名的x509证书(我曾用它来创建pkcs12证书)。我只需自签名证书,我现有的Java代码就可以正常工作。

2

注意后,Android 3.0(API等级11),网络操作是在UI线程限制HttpClient的代码。你有没有机会在UI线程上调用网络操作?

StrictMode.ThreadPolicy是自API Level 9开始引入的,并且自从API Level 11以来,默认线程策略已经被更改,简而言之,它不允许在UI线程上执行网络操作(包括HttpClient和HttpUrlConnection)。如果你这样做,你会得到NetworkOnMainThreadException。

总是建议将网络操作从UI线程移出,例如使用AsyncTask。

希望得到这个帮助。

+0

不,我所有的网络代码都运行在一个AsyncTask中,但我并没有意识到这种变化......很高兴知道。 – 2012-01-08 22:24:57