android https通过载入pfx证书获取数据
2016-01-03 16:08
656 查看
直接给代码吧。研究了几天才搞定......
由于是双向握手,那个sslcontext不能初始化为空.....问题攻克了......
public static final String CLIENT_KET_PASSWORD = "Ku6OpqKDfN4=305790"; // public static String getNewHttpClient(String url) { try { // KeyStore trustStore = KeyStore.getInstance("PKCS12", "BC"); // trustStore // .load(PcPostApplication.getInstance().getAssets() // .open("abc.pfx"), CLIENT_KET_PASSWORD.toCharArray()); SSLSocketFactory sf = new SSLSocketFactoryEx(AppConfig.mKeyStore, AppConfig.CERTFILE_PASSWORD.toCharArray()); 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)); HttpClient client = null; String msg = ""; try { ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); client = new DefaultHttpClient(ccm, params); HttpGet hg = new HttpGet(url); HttpResponse response = client.execute(hg); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instreams = entity.getContent(); msg = convertStreamToString(instreams); } return msg; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } return ""; } public static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = ""; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); }上面的载入证书并请求,可是在这须要注意一个问题SSLSocketFactory须要自己定义,看以下自己定义的代码:
public class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore, char[] arry) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); KeyManagerFactory localKeyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); localKeyManagerFactory.init(truststore, arry); KeyManager[] arrayOfKeyManager = localKeyManagerFactory.getKeyManagers(); TrustManager tm = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }; sslContext.init(arrayOfKeyManager, new TrustManager[] { tm }, new java.security.SecureRandom()); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); } }
由于是双向握手,那个sslcontext不能初始化为空.....问题攻克了......
相关文章推荐
- Java读书笔记(5)-网络编程
- TCP/IP入门--TCP/IP的概念
- 利用IHttpHandler计算页面的执行时间
- 关于Redis Sentinel网络问题的脑裂
- android Handler Thread AsyncTask httpURLConnection
- Exception in thread "http-bio-8080-exec-7"内存溢出问题
- 全站 HTTPS 来了
- http随手记
- 利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning
- Centos 7网络配置
- centos5.5配置网络连接(阿和整理)
- <八>RecycleView+CardView实现瀑布流(2、加载网络图片)
- weighttp 使用
- 网络数据获取的封装
- http 的post与get方法 以及处理中文乱码问题
- Get和post网络请求
- cityhash 32位,64位和128位介绍及函数列表 http://www.169it.com/article/17600204886416241764.html
- 计算机网络学习(三)——网络层
- AFN网络框架2.x版—网络监控
- AFN网络框架2.x版—文件上传