本文档所阐述的原理及实现过程均在服务器端与盒端已经实现单向认证的功能的基础上.
基本概念:
Https : Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了SSL(Secure Sockets Layer)协议用于对Http协议传输的数据进行加密,保证会话过程中的安全性。
.cer 文件 公钥证书文件
.jks 文件 密钥库文件
.p12 文件 密钥库文件
https单向认证: 客户端验证服务端证书,但是服务端不验证客户端证书.
https 双向认证: 客户端验证服务商证书,并且服务商也要验证客户端证书.
一:原理分析.
之前OTA应用管控实行的单向认证,只有服务器端对客户端的证书进行验证,现在需要客户端对服务器端的证书也进行验证.
客户端: 设置好在本地受信任的证书列表以及自身的证书.
服务端: 设置好在本地受信任的证书列表以及自身的证书.
所使用的证书,所有的证书密码均为sNetty:
客户端: clinet.p12(私钥证书) , sChat.cer(受信任的公钥证书)
服务器端: sChat.jks .jks文件类型是能够自身私钥证书与受信任的公钥证书的证书集合文件.
双向认证关键过程:
1. 客户端与服务器请求连接时会将自身的证书发送到服务器端,服务器从受信任的证书中找与客户端所携带证书进行验证,验证失败则结束.
2. 服务器验证通过后会从将自身证书发送到客户端进行通信,客户端从受信任的证书列表中验证通过后双方会继续通信.
二:具体实现过程:
1.生成相应的证书.
原先采用的是单向认证,只是服务器端对客户端(盒端)进行了证书验证,为了使客户端也能够验证服务器端证书,所以需要新增加一个证书对.
1.生成客户端证书库
keytool -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:\ssl\client.p12 -dname "CN=client,OU=skyworth,O=skyworth,L=SHENZHENG,ST=GUANGDONG,c=cn" -storepass sNetty -keypass sNetty
2.从客户端证书库中导出客户端公钥证书
keytool -export -v -alias client -keystore D:\ssl\client.p12 -storetype PKCS12 -storepass sNetty -rfc -file D:\ssl\client.cer
3.将客户端公钥证书导入到服务器证书库(使得服务器信任客户端证书)
keytool -import -v -alias client -file D:\ssl\client.cer -keystore D:\ssl\sChat.jks -storepass 123456
2. Android 盒端实现过程
将生成的客户端证书文件 client.p12 放到apk的assets目录下.
在原先已经实现了单向认证的基础上,盒端所做的修改只需要在请求通信时将自身的证书设置好就行.,基于jdk的主要代码代码如下:
KeyManagerFactory keyManagerFactory = KeyManagerFactory
.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream is = mContext.getAssets().open(Config.CLIENT_CERT);
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(is,Config.CLIENT_CERT_PWD.toCharArray());
is.close();
keyManagerFactory.init(ks,Config.CLIENT_CERT_PWD.toCharArray());
context = SSLContext.getInstance("TLS");
context.init(keyManagerFactory.getKeyManagers(),tmf.getTrustManagers(), null);
更改的地方只是通过相应接口将client.p12证书读取出来,再通过相关接口设置进去.
3.前端服务器配置: