Android与Windows Socket通信,TLS双向认证

Android与Windows Socket通信,TLS双向认证

Android设备作为客户端,与PC服务端进行双向认证、基于TLS 1.2协议socket通信。

  • 证书制作
  • CA签发
  • JKS转换BKS
  • 加密套件修改
  • 双向认证demo

证书制作

由于是双向认证,需要制作客户端和服务器证书,这里用到的是JAVA自带的keytool工具(请自行安装JDK环境)。
话不多说,上证书制作脚本:
1)生成服务器端公私钥对,存入密钥库,命令keytool -genkeypair:

参数 含义
-alias 设置别名,可自定义
-keyalg 设置密钥算法,DSA、RSA、ECDSA等
-valiity 有效期
-keystore 密钥库名称
-storepass 密钥库密码
-dname 指定证书发行方信息
-deststoretype 指定keystore类型,默认pkcs12

2)同理,生成客户端公私钥对:

这样就生成了自签名的服务器证书和客户端证书。

CA签发

虽然我们将服务器与客户端密钥库分别提交给对方加入到各自受信任密钥库,在通信的时候互相校验,可以做到双向认证通过,但通常情况下不会这样做,一来直接将证书丢给对方很不安全,密钥库被盗用即有身份被冒用风险;二来客户端和服务端的密钥库一旦签发给对方,其存储的证书内容被固定住,无法扩展。

所以我们引入第三方受信CA,客户端和服务端分别只要信任该CA,则该CA签发的证书都是可信任的。

由于市面上流通的知名CA都是收费签发,这里使用自签CA来模拟这个过程。

1)首先生成CA密钥库:

2)导出CA证书,用于后续导入到密钥库:
···
keytool -exportcert -alias rootca -file ca.cer -keystore ca.keystore.jks -storepass 22222222 -deststoretype pkcs12
···
3)生成服务器端证书请求serverkey.csr,即是待签发的证书文件:

4)使用 CA密钥库ca.keystore.jks对serverkey.csr进行签发:

使用keytool -printcert命令可以看到签发者变成了CA(CA.COM):

使用keytool -list -v命令查看密钥库可以看到有两个证书,一个是签发后的密钥,一个是CA,其中密钥签发者变成了CA(CA.COM):

转换服务器/客户端密钥库:

完整demo代码见 https://download.csdn.net/download/peterhu_112/10606499

【参考】 https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年7月13日
下一篇 2018年7月13日

相关推荐