Android中https请求的单向认证和双向认证-程序员宅基地

转载:http://blog.csdn.net/u011394071/article/details/52880062

 

一、HTTPS 单向认证

 

1. 给服务器生成密钥


[html]  view plain   copy
  1. keytool -genkeypair -alias skxy -keyalg RSA -validity 3650 -keypass 123456 -storepass 123456 -keystore skxy.keystore  

2. 给Tomcat服务器配置Https

tomcat/config/server.xml修改connector配置

[html]  view plain   copy
  1. <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"  
  2.                maxThreads="150" SSLEnabled="true" scheme="https" secure="true"  
  3.                clientAuth="false" sslProtocol="TLS"  
  4.                keystoreFile="conf/skxy.keystore"  
  5.                keystorePass="123456"/>  

3.导出证书

keytool -export -alias skxy -file skxy.cer -keystore skxy.keystore -storepass 123456


4.将证书放在android客户端,能够读取的地方比如assert目录

5.代码中执行网络请求,获取证书,读取https网站的数据

[html]  view plain   copy
  1. String path = "https://10.0.3.2:8443/Test/Hlloer";  
  2.   
  3.    try {  
  4.        //获取证书  
  5.        InputStream stream = getAssets().open("skxy.cer");  
  6.   
  7.        SSLContext tls = SSLContext.getInstance("TLS");  
  8.        //使用默认证书  
  9.        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());  
  10.        //去掉系统默认证书  
  11.        keystore.load(null);  
  12.        Certificate certificate =  
  13.                CertificateFactory.getInstance("X.509").generateCertificate(stream);  
  14.        //设置自己的证书  
  15.        keystore.setCertificateEntry("skxy", certificate);  
  16.        //通过信任管理器获取一个默认的算法  
  17.        String algorithm = TrustManagerFactory.getDefaultAlgorithm();  
  18.        //算法工厂创建  
  19.        TrustManagerFactory instance = TrustManagerFactory.getInstance(algorithm);  
  20.        instance.init(keystore);  
  21.        tls.init(null, instance.getTrustManagers(), null);  
  22.        SSLSocketFactory socketFactory = tls.getSocketFactory();  
  23.        HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);  
  24.   
  25.        URL url = new URL(path);  
  26.        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();  
  27.        //设置ip授权认证:如果已经安装该证书,可以不设置,否则需要设置  
  28.        conn.setHostnameVerifier(new HostnameVerifier() {  
  29.            @Override  
  30.            public boolean verify(String hostname, SSLSession session) {  
  31.                return true;  
  32.            }  
  33.        });  
  34.   
  35.        InputStream inputStream = conn.getInputStream();  
  36.        String result = getString(inputStream);  
  37.        stream.close();  

双向认证

  • 双向证书验证

首先对于双向证书验证,也就是说,客户端有自己的密匙,并持有服务端的证书,服务端给客户端发送数据时,需要将服务端的证书发给客户端验证,验证通过才运行发送数据,同样,客户端请求服务器数据时,也需要将自己的证书发给服务端验证,通过才允许执行请求。

按照以下步骤,我们设置双向认证

1.生成客户端keystore,因为客户端andoird不能用keystore格式的密钥库,所以先生成jks格式,再用Portecle工具转成bks格式

[html]  view plain   copy
  1. keytool -genkeypair -alias client -keyalg RSA -validity 3650 -keypass 123456 -storepass 123456 -keystore client.jks  

2.生成服务端keystore

[html]  view plain   copy
  1. keytool -genkeypair -alias server -keyalg RSA -validity 3650 -keypass 123456 -storepass 123456 -keystore server.keystore  

3.导出客户端证书

[html]  view plain   copy
  1. keytool -export -alias client -file client.cer -keystore client.jks -storepass 123456   

4.导出服务端证书

keytool -export -alias server -file server.cer -keystore server.keystore -storepass 123456 

5.重点:证书交换,

将客户端证书导入服务端keystore中,再将服务端证书导入客户端keystore中, 一个keystore可以导入多个证书,生成证书列表

  • 生成客户端信任证书库(由服务端证书生成的证书库)

    keytool -import -v -alias server -file E:\ssl\server.cer -keystore E:\ssl\truststore.jks -storepass 123456

  • 将客户端证书导入到服务器证书库(使得服务器信任客户端证书)

    keytool -import -v -alias client -file E:\ssl\client.cer -keystore E:\ssl\server.keystore -storepass 123456

6.查看证书库中的全部证书

  • keytool -list -keystore E:\ssl\server.keystore -storepass 123456

7.配置服务器

  • 修改server.xml文件

备注: - keystoreFile:指定服务器密钥库,可以配置成绝对路径,如“D:/key/server.keystore”,本例中是在Tomcat目录中创建了一个名- 称为key的文件夹,仅供参考。 - keystorePass:密钥库生成时的密码 - truststoreFile:受信任密钥库,和密钥库相同即可 - truststorePass:受信任密钥库密码

8.用Portecle工具,运行protecle.jar将client.jks和truststore.jks分别转换成client.bks和truststore.bks,然后放到android客户端的assert目录下

  • 运行protecle.jar--》打开文件选中client.jks,选择tools-->change keystore type-->选择BKS,最后关闭保存为client.bks

9.读取client.bks,进行网络请求

  • 通过上面的步骤生成的证书,客户端需要用到的是client.bks(客户端密钥,用于请求的时候给服务器来验证身份之用)和truststore.bks(客户端证书库,用于验证服务器端身份,防止钓鱼)这两个文件.其中安卓端的证书类型必须要求是BKS类型

10.下面给出SSLContext方式进行SSL认证的客户端代码


[html]  view plain   copy
  1. try {  
  2.        // 服务器端需要验证的客户端证书,其实就是客户端的keystore  
  3.        KeyStore keyStore = KeyStore.getInstance("BKS");  
  4.        // 客户端信任的服务器端证书  
  5.        KeyStore trustStore = KeyStore.getInstance("BKS");  
  6.   
  7.        //读取证书  
  8.        InputStream ksIn = getResources().getAssets().open("client.bks");  
  9.        InputStream tsIn = getResources().getAssets().open("truststore.bks");  
  10.   
  11.        //加载证书  
  12.        keyStore.load(ksIn,"123456".toCharArray());  
  13.        trustStore.load(tsIn,"123456".toCharArray());  
  14.        IOUtils.close(ksIn);  
  15.        IOUtils.close(tsIn);  
  16.   
  17.        //初始化SSLContext  
  18.        SSLContext sslContext = SSLContext.getInstance("TLS");  
  19.        TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");  
  20.        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("X509");  
  21.        trustManagerFactory.init(trustStore);  
  22.        keyManagerFactory.init(keyStore, "123456".toCharArray());  
  23.        sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);  
  24.   
  25.        //通过HttpsURLConnection设置链接  
  26.        SSLSocketFactory socketFactory = sslContext.getSocketFactory();  
  27.        HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);  
  28.   
  29.        URL connectUrl = new URL(url);  
  30.        HttpsURLConnection conn = (HttpsURLConnection) connectUrl.openConnection();  
  31.        //设置ip授权认证:如果已经安装该证书,可以不设置,否则需要设置  
  32.        conn.setHostnameVerifier(new HostnameVerifier() {  
  33.            @Override  
  34.            public boolean verify(String hostname, SSLSession session) {  
  35.                return true;  
  36.            }  
  37.        });  
  38.   
  39.        InputStream inputStream = conn.getInputStream();  
  40.        String content = getString(inputStream);  
  41.        IOUtils.close(inputStream);  
  42.        showLog(content);  
  43.   
  44.   
  45.    } catch (Exception e) {  
  46.        e.printStackTrace();  
  47.    }  

另外一种方法

  • 在上面的基础上,修改第五步,将服务端的证书导入客户端的keystore中,然后在客户端只用一个keystore就额可以
  • 同样需要加载信任管理器和KeyManagerFactory,加载同一个keystore即可,这个已经验证通过,如有不妥之处,请提出探讨。

    //读取证书,这里可以只讲服务端的证书导入到客户端的keystore中,然后只要读取一个就可以     //请求服务器时,将客户端的证书发给服务器验证,服务器中的keystore已经导入了客户端的证书,所以可以验证     //服务器验证通过,然后服务器将客户端的证书发给客户端验证,同样验证成功才发送其他数据。     //这里clientkeystore包含客户端的keystore和服务端的证书,客户端的keystore中包含自己的证书。     InputStream ksIn = getResources().getAssets().open("clientkeystore.bks");     InputStream tsIn = getResources().getAssets().open("clientkeystore.bks");

转载于:https://www.cnblogs.com/gccBlog/p/7090853.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/anshi4203351518/article/details/101966682

智能推荐

macos mojave_如何在macOS Mojave中启用暗模式-程序员宅基地

文章浏览阅读245次。macos mojaveMacOS Mojave brought with it a slew of new features, the most striking of which is a system-wide dark mode that applies to all native Apple apps and compliments Apple’s Night Shift to ease..._macos夜间模式太灰色

ubuntu 16.04 + ROS kinetic 安装Kinect v1驱动_ros16下安装kinectv1驱动-程序员宅基地

文章浏览阅读2.7k次。openni、Sensor、NITE(可选)这三个包的版本必须匹配才能正常运行主要参考①https://www.20papercups.net/programming/kinect-on-ubuntu-with-openni/②https://blog.csdn.net/u011092188/article/details/54861591③https://blog.csdn.ne..._ros16下安装kinectv1驱动

2020最新版Python学习路线图--Python框架与项目重点知识_传智博客2020 python-程序员宅基地

文章浏览阅读1.3k次。Python学习路线图的Python框架部分有Django框架和Flask框架,学完这部分Python框架就可以去找Web全栈工程师工作,独立开发前端和后端业务。Python学习路线图的Django框架部分需要掌握Web主流框架-Django的使用;可根据Web框架设计,开发对应的数据库;可根据业务流程图,开发Web网站的前后台业务。黑马程序员Python学习路线图的Flask框架部分需要掌握W..._传智博客2020 python

HOJ Megaminx-程序员宅基地

文章浏览阅读705次。MegaminxMy Tags (Edit) Source : fishcanfly Time limit : 1 sec Memory limit : 64 MSubmitted : 59, Accepted : 47M_hoj

snapchat注册不到_从Snapchat获得开发人员职位中学到的经验教训-程序员宅基地

文章浏览阅读144次。snapchat注册不到Here are three links worth your time: 这是三个值得您花费时间的链接: I just got a developer job at Snapchat. Here’s what I learned and how it can help you with your job search (15 minute read) 我刚刚在Snapc..._type in snapchat search

鸟哥的LINUX私房菜第二章 学习笔记-程序员宅基地

文章浏览阅读218次。0.2.1多核CPU是指在一颗CPU封装当中嵌入了两个及以上的运算核心不同的CPU型号大多有不同的脚位,更换CPU时要注意能否与主板相配频率是指CPU每秒钟可以进行的工作次数但注意,不同的CPU之间不能单纯以频率判断运算效能 早期的CPU构架主要通过北桥来链接系统最重要的CPU,主存储器与相关适配器设置;由于所有设备通过北桥连接,所以每个设备的工作频率都应该相同;但

随便推点

离散数学大作业_离散数学实验大作业-程序员宅基地

文章浏览阅读932次,点赞19次,收藏22次。1.作业要求2.题目选择命题公式的真值表用户输入一个命题公式,输出该公式对应的真值表。例如:输入(p ∨ q) → ¬r,输出:题目描述关于为什么选择了这个题目,最后会提到 。3.所需解决的关键问题4.代码使用Python完成注释已经给出。import itertoolsfrom tabulate import tabulate # 导入 tabulate 用于美化表格格式# 处理蕴含操作的函数def handle_imp_离散数学实验大作业

查看wpar的配置信息_基于FC适配器的WPAR创建和Oracle数据库配置-程序员宅基地

文章浏览阅读65次。存档日期:2019年5月13日 | 首次发布:2012年9月12日 工作负载分区(WPAR)是IBMAIX6.1和更高版本随附的许可程序产品。 本文介绍了导出了光纤通道(FC)的WPAR的概念和配置。 此外,它还描述了在WPAR内安装和配置Oracle数据库和Oracle自动压力测试(OAST)工作负载的步骤。 此内容不再被更新或维护。 全文以PDF格式“按原样”提供。 随着技术的..._fc适配器存储配置

outlook收邮件延迟_如何计划或延迟在Outlook中发送电子邮件-程序员宅基地

文章浏览阅读5.7k次。outlook收邮件延迟When you click Send on an email, it is typically sent immediately. Butwhat if you want to send it at a later time? Outlook allows you delay the sending of a single message or all email me..._outlook delay delivery

jQuery中attr的用法_jq attr用法-程序员宅基地

文章浏览阅读7.4k次,点赞13次,收藏44次。attr用来获取属性,prop获取特性Jquery1.6之后,可以通过attr方法去获得属性,通过prop方法去获得特性属性指的是“name,id”等等,特性指的是“selectedIndex, tagName, nodeName”jquery判断checked的三种方法:.attr('checked'): //看版本1.5-返回:true或false.prop('checked')..._jq attr用法

feed_如何自定义Google Feed(并使之真正有用)-程序员宅基地

文章浏览阅读1.2k次。feedWhen Google first released Google Now, it was celebrated by Android users across the board. When Now evolved into the Google Feed, however, this change was much less accepted. But the Feed is grea..._feed ang grow怎么自定义

meteor构建app程序_在Meteor.js中构建Slack克隆:实时数据-程序员宅基地

文章浏览阅读267次。meteor构建app程序This is the second of a five-part series on building a Slack clone using Meteor. The aim of these tutorials are not just for you to blindly follow instructions, but it's our hope that you...