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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近开发的时候遇到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

。。。。

先开文章有空来完成。

 

 

 

 

 

 

转载于:https://my.oschina.net/mastere/blog/518087

你可能感兴趣的:(移动开发,java,python)