文档章节

Android版Https客户端与服务端的双向证书实现

yizhihaohut
 yizhihaohut
发布于 2015/10/16 17:23
字数 1022
阅读 9635
收藏 6

最近开发的时候遇到Https协议的问题

因为项目用的是Volley来进行http请求,但是使用Volley之后,发现他并不支持Https请求。

查看源码:

if(VERSION.SDK_INT >= 9) {
    stack = new HurlStack();
} else {
    stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}

从源码中我们可以看出来执行网络请求的关键类Httpstack初始化在主流版本API大于9的时候是以new HurlStack()的方式初始化

而当我们进入HurlStack.class

HurlStack() {
    ((HurlStack.UrlRewriter))}

HurlStack(HurlStack.UrlRewriter urlRewriter) {
    (urlRewriter(SSLSocketFactory))}

HurlStack(HurlStack.UrlRewriter urlRewriterSSLSocketFactory sslSocketFactory) {
    .mUrlRewriter = urlRewriter.mSslSocketFactory = sslSocketFactory
    }

我们发现HurlStack的3个构造函数中其实是有带SSLSocketFactory参数的

但是Volley初始化HttpStack默认是用的是无参的构造方法

所以解决方案是给Volley复写一个可以传入SSLsocketFactory参数的方法

 

实现双向认证的基本逻辑是:

1、生成服务端密钥库并导出证书.
2、生成客户端密钥库并导出证书.
3、根据服务端密钥库生成客户端信任的证书.
4、将客户端证书导入服务端密钥库.
5、将服务端证书导入浏览器.

生成密钥库和证书:
因使用java环境,下面使用jdk下面的keytool工具来生成相应的密钥库和证书
下面的命令是在windows 7 下面测试通过的,可以直接复制使用
1、创建目录,如d:/sslDemo

2、使用资源管理进入d:/sslDemo,按住shift+右键,弹出菜单,选择"在此处打开命令行".

3、服务器端相关操作
3.1、生成服务器证书库
keytool -validity 36500 -genkey -v -alias server -keyalg RSA -keystore server.keystore -dname "CN=www.itjoyee.com,OU=itjoyee.com,O=itjoyee.com,L=Wuhan,ST=HuBei,c=cn" -storepass 123456 -keypass 123456
注: 服务器证书库参数“CN”必须与服务端的IP地址相同,否则会报错,客户端的任意。

validity表示有效期,姓名与姓氏CN,OU表示组织单位名称,O表示组织名称,L城市或区域名称,ST表示省或者州,C表示国家

执行该命令之后会生成自动生成一份服务器证书server.keystore


3.2、从服务器证书库中导出二进制格式的服务器证书
keytool -export -v -alias server -keystore server.keystore -storepass 123456 -rfc -file server.cer

3.3、生成客户端信任证书库(由服务端证书生成的证书库,客户端使用此证书验证服务端来源可靠)
keytool -import -v -alias server -file server.cer -keystore client.truststore -storepass 123456 -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider

注:-storetype BKS 是生成android上面可以识别的格式,如果不指定jdk默认生成的格式是JKS.
-provider org.bouncycastle.jce.provider.BouncyCastleProvider,需要下载jar包bcprov-jdk16-1.46.jar放到jdk1.7.0_65\jre\lib\ext\目录下.
注意需要jdk16,其他的版本android下面有版本不匹配的问题.


4、客户端相关操作
4.1、生成客户端证书库
keytool -validity 36500 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname "CN=clients.itjoyee.com,OU=jiajianfa,O=jiajianfa,L=Wuhan,ST=HuBei,c=cn" -storepass 123456 -keypass 123456

4.2、从客户端证书库中导出客户端证书
keytool -export -v -alias client -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer

注:客户端证书可以产生多个.

4.3、将客户端证书导入到服务器证书库(使得服务器信任客户端证书,服务器端用此验证客户端的合法性)
keytool -import -v -alias client -file client.cer -keystore server.keystore -storepass 123456

4.4、查看服务端证书中信任的客户端证书
keytool -list -keystore server.keystore -storepass 123456

5、服务器端配置
由于使用tomcat,下面使用tomcat做为实例配置.
5.1、在tomcat安装目录下新建key目录,将上面生成的server.keystore复制过去.
5.2、编辑tomcat安装目录下的conf目录下的server.xml,如:d:\sslDemo\apache-tomcat-7.0.55\conf\server.xml

。。。。

先开文章有空来完成。

 

 

 

 

 

 

© 著作权归作者所有

yizhihaohut
粉丝 7
博文 21
码字总数 19843
作品 0
松江
程序员
私信 提问
基于java的https双向认证,android上亦可用

概述: 客户端,浏览器或者使用http协议和服务器通信的程序。 如: 客户端通过浏览器访问某一网站时,如果该网站为HTTPS网站,浏览器会自动检测系统中是否存在该网站的信任证书, 如果没有信任证...

ilovej
2014/10/31
3.6K
2
Android与MINA2、Netty4的跨平台UDP双向通信实战

概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。 当前由于NIO框架的流行,使得开发大并发、高性能的互联网服务端成为可能。...

JackJiang-
2016/06/30
881
1
Unity中Android API 28之后无法HTTP请求

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/zhenghongzhi6/article/details/90294799 本文节选自洪流学堂公众号技...

关尔Manic
05/17
0
0
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo。服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了。同时...

JackJiang-
2016/06/28
689
0
Android Socket编程学习笔记

度娘给出的描述: 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个...

长平狐
2013/04/25
24.4K
4

没有更多内容

加载失败,请刷新页面

加载更多

解答二进制求和

思路:创建一个新的字符串,用于记录原两个字符串每位相加的结果。 1、因为是从左到右计算,所以要把字符串先进行反转,用reverse()方法。 2、字符串对齐,采用补零的方法。 3、计算的时候...

无名氏的程序员
29分钟前
4
0
JSONUtils

package com.demo.utils;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Tr......

任梁荣
29分钟前
5
1
在jest中配置typescript

测试是报错: Property 'assign' does not exist on type 'ObjectConstructor' NodeJS已经是最新版了,但道理不需要polyfill。 然后发现是typescript的lib没有"es2015.core",说明ts-jest没有......

linsk1998
30分钟前
3
0
Redis实现分布式文件夹锁

缘起 最近做一个项目,类似某度云盘,另外附加定制功能,本人负责云盘相关功能实现,这个项目跟云盘不同的是,以项目为分配权限的单位,同一个项目及子目录所有有权限的用户可以同时操作所有...

逸竹小站
39分钟前
3
0
Andorid SQLite数据库开发基础教程(2)

Andorid SQLite数据库开发基础教程(2) 数据库生成方式 数据库的生成有两种方式,一种是使用数据库管理工具生成的数据库,我们将此类数据库称为预设数据库,另一种是使用代码生成的数据库。...

大学霸
59分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部