Android Https详细请求全方案实现,包括HttpUrlConnection及HttpClient方式实现指定证书及信任所有的实现,不多说了,以下代码都经过详细测试,可以直接使用。
package com.example.httpstest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import android.app.Activity; import android.os.Bundle; import android.util.Log; /** * HTTPS测试 测试地址:https://certs.cac.washington.edu/CAtest/ * 测试证书:https://www.washington.edu/itconnect/security/ca/load-der.crt * * * @author guojing09 * */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Thread(new Runnable() { @Override public void run() { try { initSSLWithHttpClinet(); } catch (Exception e) { Log.e("HTTPS TEST", e.getMessage()); } } }).start(); } /** * HttpUrlConnection 方式,支持指定load-der.crt证书验证,此种方式Android官方建议 * * @throws CertificateException * @throws IOException * @throws KeyStoreException * @throws NoSuchAlgorithmException * @throws KeyManagementException */ public void initSSL() throws CertificateException, IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException { CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream in = getAssets().open("load-der.crt"); Certificate ca = cf.generateCertificate(in); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(null, null); keystore.setCertificateEntry("ca", ca); String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); tmf.init(keystore); // Create an SSLContext that uses our TrustManager SSLContext context = SSLContext.getInstance("TLS"); context.init(null, tmf.getTrustManagers(), null); URL url = new URL("https://certs.cac.washington.edu/CAtest/"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); urlConnection.setSSLSocketFactory(context.getSocketFactory()); InputStream input = urlConnection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); StringBuffer result = new StringBuffer(); String line = ""; while ((line = reader.readLine()) != null) { result.append(line); } Log.e("TTTT", result.toString()); } /** * HttpUrlConnection支持所有Https免验证,不建议使用 * * @throws KeyManagementException * @throws NoSuchAlgorithmException * @throws IOException */ public void initSSLALL() throws KeyManagementException, NoSuchAlgorithmException, IOException { URL url = new URL("https://certs.cac.washington.edu/CAtest/"); SSLContext context = SSLContext.getInstance("TLS"); context.init(null, new TrustManager[] { new TrustAllManager() }, null); HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String arg0, SSLSession arg1) { return true; } }); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(false); connection.setRequestMethod("GET"); connection.connect(); InputStream in = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line = ""; StringBuffer result = new StringBuffer(); while ((line = reader.readLine()) != null) { result.append(line); } Log.e("TTTT", result.toString()); } /** * HttpClient方式实现,支持所有Https免验证方式链接 * * @throws ClientProtocolException * @throws IOException */ public void initSSLAllWithHttpClient() throws ClientProtocolException, IOException { int timeOut = 30 * 1000; HttpParams param = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(param, timeOut); HttpConnectionParams.setSoTimeout(param, timeOut); HttpConnectionParams.setTcpNoDelay(param, true); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", TrustAllSSLSocketFactory.getDefault(), 443)); ClientConnectionManager manager = new ThreadSafeClientConnManager(param, registry); DefaultHttpClient client = new DefaultHttpClient(manager, param); HttpGet request = new HttpGet("https://certs.cac.washington.edu/CAtest/"); // HttpGet request = new HttpGet("https://www.alipay.com/"); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); StringBuilder result = new StringBuilder(); String line = ""; while ((line = reader.readLine()) != null) { result.append(line); } Log.e("HTTPS TEST", result.toString()); } /** * HttpClient方式实现,支持验证指定证书 * * @throws ClientProtocolException * @throws IOException */ public void initSSLCertainWithHttpClient() throws ClientProtocolException, IOException { int timeOut = 30 * 1000; HttpParams param = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(param, timeOut); HttpConnectionParams.setSoTimeout(param, timeOut); HttpConnectionParams.setTcpNoDelay(param, true); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); registry.register(new Scheme("https", TrustCertainHostNameFactory.getDefault(this), 443)); ClientConnectionManager manager = new ThreadSafeClientConnManager(param, registry); DefaultHttpClient client = new DefaultHttpClient(manager, param); // HttpGet request = new // HttpGet("https://certs.cac.washington.edu/CAtest/"); HttpGet request = new HttpGet("https://www.alipay.com/"); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); StringBuilder result = new StringBuilder(); String line = ""; while ((line = reader.readLine()) != null) { result.append(line); } Log.e("HTTPS TEST", result.toString()); } public class TrustAllManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } } }
package com.example.httpstest; import java.io.IOException; import java.lang.reflect.Field; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLException; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocket; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.http.conn.scheme.SocketFactory; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.conn.ssl.X509HostnameVerifier; import android.os.Build; public class TrustAllSSLSocketFactory extends SSLSocketFactory { private javax.net.ssl.SSLSocketFactory factory; private static TrustAllSSLSocketFactory instance; private TrustAllSSLSocketFactory() throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException { super(null); SSLContext context = SSLContext.getInstance("TLS"); context.init(null, new TrustManager[] { new TrustAllManager() }, null); factory = context.getSocketFactory(); setHostnameVerifier(new X509HostnameVerifier() { @Override public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException { // TODO Auto-generated method stub } @Override public void verify(String host, X509Certificate cert) throws SSLException { // TODO Auto-generated method stub } @Override public void verify(String host, SSLSocket ssl) throws IOException { // TODO Auto-generated method stub } @Override public boolean verify(String host, SSLSession session) { // TODO Auto-generated method stub return true; } }); } public static SocketFactory getDefault() { if (instance == null) { try { instance = new TrustAllSSLSocketFactory(); } catch (KeyManagementException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecoverableKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return instance; } @Override public Socket createSocket() throws IOException { return factory.createSocket(); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { if (Build.VERSION.SDK_INT < 11) { // 3.0 injectHostname(socket, host); } return factory.createSocket(socket, host, port, autoClose); } private void injectHostname(Socket socket, String host) { try { Field field = InetAddress.class.getDeclaredField("hostName"); field.setAccessible(true); field.set(socket.getInetAddress(), host); } catch (Exception ignored) { } } public class TrustAllManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return null; } } }
package com.example.httpstest; import java.io.IOException; import java.io.InputStream; import java.net.Socket; import java.net.UnknownHostException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.Certificate; import java.security.cert.CertificateFactory; import org.apache.http.conn.ssl.SSLSocketFactory; import android.content.Context; public class TrustCertainHostNameFactory extends SSLSocketFactory { private static TrustCertainHostNameFactory mInstance; public TrustCertainHostNameFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); } public static TrustCertainHostNameFactory getDefault(Context context) { KeyStore keystore = null; try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); InputStream in; in = context.getAssets().open("load-der.crt"); Certificate ca = cf.generateCertificate(in); keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(null, null); keystore.setCertificateEntry("ca", ca); if (null == mInstance) { mInstance = new TrustCertainHostNameFactory(keystore); } } catch (Exception e) { } return mInstance; } @Override public Socket createSocket() throws IOException { return super.createSocket(); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return super.createSocket(socket, host, port, autoClose); } }
相关推荐
Android网络请求OkHttp的使用demo代码
Android异步请求网络图片demo,博客地址:http://blog.csdn.net/yayun0516
android https demo,在android 客户端使用https请求
博客地址 http://blog.csdn.net/sbsujjbcy/article/details/45568053
## 一、主要内容 1、开发网络请求前的基本准备 2、普通网络请求代码 3、使用OkHttp网络框架请求网络代码 4、使用Retrofit网络框架请求网络代码 5、使用WebView显示对应网址的网页 6、应用demo的相关代码和apk
android 网络请求框架demo volley,里面有get。post请求方式
主要为大家详细介绍了android post请求接口测试代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android开发HTTP使用okgo请求数据的实现demo,实现方法——引入依赖再进行自定义封装,封装了传参和解析返回的json数据,使用非常方便。
网络请求 HTTPURLConnection GET ,一个简单的网络访问的DEMO,大家在自己使用的时候记得在manifest中修改网络权限
android请求php数据通过json交互demo,含有数据库,数据库自行修改可支持中文。代码清晰,json自成一个文件,偏于移植。
利用android-async-http开源框架进行网络请求
android 当中涉及到网络编程的部分经常会用到http通信,同时android也为我么您提供了HttpUrlConnection接口和HttpClient接口,大大的方便了开发。Http通信又分为两种方式:get和post,get可以uoqu静态页面,传入参数...
这个demo资源是Android开发的okhttp网络请求框架demo,包括单个文件和多个文件上传方法封装
android封装开发框架,包含okhttp网络请求,butterknife和Gson封装工具类等,并且使用了MVC模式,里面编写了网络请求demo以及基类抽取
这个代码包里包括了 http get post, httpclient get、post ,还包括安卓socket客户端代码,需要另外的 服务端代码,可以去下载DEMO_JAVA
android中HTTP请求模式运用实例源码可运行,Android studio版本
Android Kotlin简单使用Demo,使用了viewpager+tablayout+fragment,XUtils网络请求等kotlin的简单函数
Android天气预报demo:是一个最简单的 http 请求 ,解析返回json,在界面展示的效果。支持动态选择城市
压缩包里面有四个项目,分别是android端UDP发送、接受UDP广播程序,PC端UDP发送、接受UDP广播程序。 大致描述:客户端发送UDP广播到局域网,服务端收到广播后,获得客户端ip,发送一次socket请求,客户端收到socket...
Android项目组件化学习demo,内容包含底层基础类模块,网络请求类模块,常用工具栏模块,多模块简单集成,内容简单,思想醇厚