gpt4 book ai didi

java - Android 4.0 中的 SSL 客户端身份验证失效

转载 作者:搜寻专家 更新时间:2023-11-01 09:10:11 27 4
gpt4 key购买 nike

我有一个 Android 应用程序,它使用 SSLSocketFactory 加载 pkcs12 证书并使用该证书对我的服务器执行 SSL 客户端身份验证。此过程在 Android 2.1、2.2 和 2.3 上完美运行,但是当我尝试在运行 4.0 的手机或模拟器上运行此代码时,我的服务器没有从我的应用程序发出的请求中接收到公钥。

这是我用来获取用于执行请求的 HttpClient 的代码

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;
}

最佳答案

请注意,在 Android 3.0(API 级别 11)之后,网络操作仅限于 UI 线程。你有没有在 UI 线程上调用网络操作?

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

始终建议将网络操作移出 UI 线程,例如,使用 AsyncTask。

希望这对您有所帮助。

关于java - Android 4.0 中的 SSL 客户端身份验证失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com