在安卓开发中需要自己写代码实现校验公钥的功能

当然,  如果是自己服务器,就不用校验,
如果是别人的服务器,比如银行,就需要校验

在这里, 小编采用从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();
}
}

最新文章

  1. $POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
  2. webstorm 注册码,亲测可用
  3. Python:装饰器
  4. ubuntu系统安装mongodb
  5. lucene-源码分析
  6. JAVA_FastJson
  7. STL priority_queue sort 自定义比较终极模板
  8. 深入解析Java中volatile关键字的作用
  9. NOIP2010-普及组复赛-第四题-三国游戏
  10. (SQL Server)有关T-SQL的10个好习惯
  11. 前端笔记之NodeJS(二)路由&REPL&模块系统&npm
  12. WAN口和LAN 口有什么区别
  13. LR基本知识学习
  14. python中的%s%是什么意思
  15. Python3.x使用PyMysql连接MySQL数据库
  16. day16 包的使用 json time 常用模块
  17. jqgrid 滚动分页
  18. 【Eclipse】启动时报错:No Java virtual machine (已解决)
  19. centos7.3下ScyllaDB1.6安装
  20. UVa 1664 Conquer a New Region(并查集)

热门文章

  1. python 基础1
  2. ajax实现
  3. js点击空白处触发事件
  4. WordPress-Word图片上传插件整合教程-Xproer.WordPaster
  5. Spring MVC 指导文档解读(二)
  6. windows下解决numpy, scipy等库安装失败的方法
  7. 自定义cell的高度
  8. stm32的gpio函数介绍
  9. 网络编程socket、udp
  10. Lib作为“静态库”与“动态库”中的区别