OSI七层模型
计算机网络的OSI七层模型和TCP/IP四层模型想必大家都知道。其中SSL/TLS是一种介与于传输层(比如TCP/IP)和应用层(比如HTTP)的协议。它通过"握手协议(Handshake Protocol)"和"传输协议(Record Protocol)"来解决传输安全的问题。SSL/TLS是一个可选层,没有它,使用HTTP也可以通信,它存在的目的就是为了解决安全问题,这也就是HTTPS相对于HTTP的精髓所在
SSL协议
SSL(Secure Sockets Layer)最初由Netscape定义, 分别有SSLv2和SSLv3两个版本(SSLv1未曾对外发布); 在SSLv3之后SSL重命名为TLS。
协议 | 时间 | 建议 | 说明 |
---|---|---|---|
SSLv1 | / | / | 实际从未公开发布 |
SSLv2 | 1995 | 弃用 | IETF已于2011年弃用 |
SSLv3 | 1996 | 弃用 | IETF已于2015年弃用 |
TLSv1.0 | 1999 | 兼容 | - |
TLSv1.1 | 2006 | 兼容 | - |
TLSv1.2 | 2008 | 主推 | 目前最新可用版本 |
TLSv1.3 | / | / | 2016开始草案制定 |
——————
图解如下
图解说明
-
客户端发出请求(Client Hello), 提供给服务端以下信息
支持的SSL/TLS协议版本
客户端支持的加密算法列表(非对称和对称算法)
支持的压缩算法列表
产生随机数number, 用以生成session key(对话秘钥) -
服务端回应(Server Hello), 提供给客户端以下信息
根据客户端支持的SSL/TLS协议版本,和自己的比较确定使用的SSL/TLS协议版本,如果没有合适的,对话关闭
回应加密套件,压缩算法
产生的一个随机数number,稍后用于生成"对话密钥(session key)"
服务端数字证书(证明自己的身份,传递公钥)
如果需要验证客户端,发出请求,要求客户端提供证书(SSL分为单项认证和双向认证,一般浏览器客户端只需要验证服务器的身份就行了) -
客户端回应
客户端收到服务端的回应后,首先验证服务端的数字证书,如果证书没有问题继续下去,如果证书有问题,则会有相应提示,或者对话直接关闭。然后客户端在向服务端发送以下信息:
- 如果服务端有请求证书,发送自己的数字证书
- 产生一个随机数pre-master key(random number),并且用服务端数字证书中的公钥加密 这里我用公钥加密,服务端有私钥,所以可以获得这个随机数(先要确认服务端身份,我使用服务端的公钥机密自己的随机数,那么只有服务端可以解密这个随机数)
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
- 服务端最后的回应
如果有客户端的证书,就先验证客户端的证书
- 使用自己的私钥,对随机数pre-master key解密,这时客户端和服务端各自有了三个随机数,然后用原来协商的加密方式生成本次通话使用的会话密钥(session key)
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送
服务器会为每个浏览器(或客户端软件)维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!
1. 数字证书的作用
由权威的CA机构发布的,可以证明服务器的身份,防止李鬼
2. 如何防止中间人攻击?
3. 为什么要协商对称算法呢?
由于是公私钥对加密太消耗资源了,所以最后改为对称加密的方式进行数据的传输
4. 三个随机数的作用
实战
-
客户端发出请求(Client Hello), 提供给服务端以下信息
> 可以看到支持的最低版本TSL 1.2、以及16种密码套件、随机数、Session ID
-
服务端回应(Server Hello), 提供给客户端以下信息
可以看到服务端提供了类似信息, 只支持TLS_CHACHA20_POLY1305_SHA256 -
待续…