Android开发中实现https校验
2016-03-12 00:34
513 查看
在安卓开发中需要自己写代码实现校验公钥的功能
当然, 如果是自己服务器,就不用校验,
如果是别人的服务器,比如银行,就需要校验
在这里, 小编采用从github上下载的开源框架实现,在开源框架中添加部分代码
下载到开源框架后, 在 AsyncHttpClient.java文件中添加
找到215行代码, 在这里添加校验的代码
证书文件需要拷贝到src的根目录
还有不校验的代码
注意,
在拷贝代码的过程中 SSLSocketFactory 需要自己创建出来, 代码如下:
当然, 如果是自己服务器,就不用校验,
如果是别人的服务器,比如银行,就需要校验
在这里, 小编采用从github上下载的开源框架实现,在开源框架中添加部分代码
下载到开源框架后, 在 AsyncHttpClient.java文件中添加
找到215行代码, 在这里添加校验的代码
证书文件需要拷贝到src的根目录
//在这里添加一段 代码, 实现 https 连接, 检验 , 主要是去校验 证书的合法性 try { InputStream ins = AsyncHttpClient.class.getClassLoader() .getResourceAsStream("hehe.cer"); // 这个文件就是网站的公钥 CertificateFactory cerFactory = CertificateFactory .getInstance("X.509");// X.509 公钥文件 .pk8 私钥文件的扩展名 Certificate cer = cerFactory.generateCertificate(ins); KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC"); keyStore.load(null, null); keyStore.setCertificateEntry("trust", cer); SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore); schemeRegistry.register(new Scheme("https", socketFactory, httpsPort)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return schemeRegistry;
还有不校验的代码
//在这里添加一段 代码, 实现 https 连接, 不检验 try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore); //相当于 不在校验数据的合法性 sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); // 允许所有主机的验证 schemeRegistry.register(new Scheme("https", sslSocketFactory, httpsPort)); schemeRegistry.register(new Scheme("https",sf, httpsPort)); } catch (Exception e) { e.printStackTrace(); } return schemeRegistry;
注意,
在拷贝代码的过程中 SSLSocketFactory 需要自己创建出来, 代码如下:
package com.loopj.android.http; import java.io.IOException; 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 javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.apache.http.conn.ssl.SSLSocketFactory; class SSLSocketFactoryEx extends SSLSocketFactory { SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); TrustManager tm = new X509TrustManager() { @Override public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted( java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } @Override public void checkServerTrusted( java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException { } }; sslContext.init(null, new TrustManager[] { tm }, null); } @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(); } }
相关文章推荐
- 计算机网络相关知识
- TCP的三次握手和四次撒手
- 配置Tomcat使用https协议
- 网络排错大讲解
- 只因“一个小的梦想”捧红了网络视频直播
- HTTP请求报文和HTTP响应报文
- http://elf8848.iteye.com/blog/875830/
- HTTP Session 的理解
- 关于tcp连接的建立(三次握手)和释放(四次握手)
- TCP/IP有限状态机
- 无线传感器网络数据融合技术
- 无线传感器网络数据融合概述
- Android高效网络请求Retrofit框架
- 面试2-两种 HTTP 请求方法:GET 和 POST
- iOS 开源项目介绍之网络篇
- 多态的实现:http://bbs.csdn.net/topics/370166353
- tcp短连接TIME_WAIT问题解决方法大全(2)——SO_LINGER
- 面试1-HTTP状态码
- TCP协议中的SO_LINGER选项
- CetnOS6,最小化安装后安装网络管理工具