文档章节

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

yizhihaohut
 yizhihaohut
发布于 2015/10/16 17:23
字数 1022
阅读 6924
收藏 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
0
2
android网络通信之socket教程实例汇总

一、socket基础 1、Socket通讯机制(详细),如何将socket通信的客户端与服务器 http://www.eoeandroid.com/thread-61727-1-1.html 2、Http和Socket区别 http://www.eoeandroid.com/thread-9...

程序袁_绪龙
2014/12/11
0
0
Openssl 自签证书实现nginx双端验证的https

1.首先是下载openssl http://slproweb.com/products/Win32OpenSSL.html 2.安装完成之后,进入bin目录,运行openssl.exe 3.实现双端验证,首先需要一个自签的ca根证书,然后用根证书对server与...

Sorata
2017/11/08
0
0
https与SSL协议详解及Java实现免证书访问https服务代码

https与SSL协议详解及Java实现免证书访问https服务代码。 本着实用原则,本文不讲太多理论性的东西,更多关注的是实际应用中的问题。在阅读此文章之前,默认你已经熟悉了对称加解密、非对称加...

网络协议
2017/11/29
0
0
Charles 抓包工具安装和采坑记录

Charles 抓包工具安装和采坑记录 网络抓包是解决网络问题的第一步,也是网络分析的基础。网络出现问题,第一步肯定是通过抓包工具进行路径分析,看哪一步出现异常。做网络爬虫,第一步就是通...

和牛
07/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

七牛qshell工具 批量删除操作

qshell 下载地址&文档(http://developer.qiniu.com/code/v6/tool/qshell.html) 这里我们演示的是windows下的操作,将下载的工具改名为:qshell.exe 然后将文件的路径添加到PATH qshell accou...

koothon
20分钟前
1
0
Fastjson-fastjson中$ref对象重复引用问题

import java.util.ArrayList;import java.util.List;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.SerializerFeature;/** * fastjson中$ref对象......

小黄狗
26分钟前
1
0
mybatis一级缓存

mybatis执行查询的流程,最终都是通过动态代理进入到MapperProxy的invoke方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try......

wuyiyi
27分钟前
2
0
安装weblogic wls1033_generic.jar 遇见的坑

接别人的烂摊子,weblogic部署没部署成功不部署了 让我远程给别人部署weblogic 11g 部署完成启动域的时候启动不了报错如下 Unrecognized option: -jrockit Error: Could not create the Ja...

雁南飞丶
27分钟前
1
0
通过7个python函数理解区块链

我想对于那里的很多人来说,区块链就是这种现象,很难不让你头脑发热。我开始观看视频和阅读文章,但对我个人而言,直到我编写自己的简单区块链,我才真正理解它是什么以及它的潜在应用价值。...

笔阁
28分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部