Android版Https客户端与服务端的双向证书实现
Android版Https客户端与服务端的双向证书实现
yizhihaohut 发表于2年前
Android版Https客户端与服务端的双向证书实现
  • 发表于 2年前
  • 阅读 5295
  • 收藏 6
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 现在主流软件都用信用所有证书的偷懒做法实现Https通信 启示很容易被中转路由或者服务器给截获关键信息 下面是乌云漏洞公布的主流软件漏洞 http://www.wooyun.org/bugs/wooyun-2014-079358

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

。。。。

先开文章有空来完成。

 

 

 

 

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 7
博文 20
码字总数 19843
×
yizhihaohut
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: