https 介绍
Https 即安全的超文本传输协议,最初是由网景公司创建,Https在Http上面提供了一个传输级的安全层,目前安全层所用的协议是SSL(Secure Socket Layer)和其继任者TLS(Transport Layer Security),SSL是一个比较复杂的协议,已有商用和开源的实现版本,例如OpenSSL。所有Http请求和响应数据在传输到网络前都由安全层进行加密,如下图是Https和Http的网络协议层。
HTTP | 应用层 |
SSL or TLS | 安全层 |
TCP | 传输层 |
IP | 网络层 |
网络接口 | 数据链路层 |
客户端在于服务端建立连接前,需要进行握手,握手过程可以分为单向和双向认证。
- 单向认证
客服端只对服务端身份进行认证,具体认证过程如下图:
2. 双向认证
客服端不仅对服务端身份进行认证,同时服务端也需要客服端发送自己的身份信息,对客服端进行认证,具体认证过程如下图:
JSSE 介绍
JSEE 全称Java Secure Socket Extension,提供了一个java版本的SSL 协议的框架和实现,包括数据加密、服务器认证、消息完整性校验及可选的客服端认证等功能。Java应用程序可以借助JSEE,方便地实现Https通信。
在JSEE API中,连接的端点类是SSLSocket和 SSLEngine,下图展示了用于创建SSLSocket和SSLEngine的类:
从图中应该很容易看出,客服端所用的SSLSocket由SSLSocketFactory创建,服务器用的SSLServerSocket由SSLServerSocketFactory创建,这两个factory由SSLContext创建,SSLContext对象创建后需要用KeyManger、TrustManger、SecureRandom进行初始化,分别对本文用到的几个类说明下,对其他类有兴趣的可以参考oracle JSSE官方文档。
https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html
- SSLSocket:继承java网络编程中Socket的作用,应用程序通过SSLSocket完成SSL握手、通信数据的收发等;
- SSLEngine:类同SSLSocket,比SSLSocket功能更强大,SSLSocket提供的是阻塞IO模型,SSLEngine能提供非阻塞的IO模型;
- KeyManger:用于管理密钥、证书等,通信的一端通过KeyManager获取密钥、证书传递给通信对方,对方验证证书获取密钥;
- TrustManger:用于管理信任材料,用于验证通信对等方的身份,传递的证书是否合法;