废话不说直接上图
https.pngA端、B端可为客户端与服务端 服务端与服务端此处以Android开发为例将AB视为客户端与服务端
步骤说明
- client hello 为单字节数据 附加信息中包含
可选的TLS版本
可选的加密套件:对称加密算法 非对称加密算法 hash算法
A端生成的一个随机数 - server hello 为单字节数据 将服务端选中的各种配置项及服务端生成的一个随机数发送给客户端
- 服务端证书发给客户端 证书中包含服务端主机名、服务端的公钥c(一条数据)、公钥c的签名(用证书签发机构的私钥对公钥c的hash值进行非对称加密后得到 数据)、证书签发机构的公钥d等
A端收到证书后会对证书的合法性进行校验 - 使用服务端的公钥c将一个生成的随机数进行加密发给服务端 加密后数据被称为Pre-master secret, 客户端发送后与服务端接收后都会使用双方交互的两个随机数及Pre-master secret 在两端都生成:
客户端 master secret:
服务端 master secret:
客户端加密秘钥:
客户端向服务端发送消息时使用 服务端收到消息后用该秘钥解密
服务端加密秘钥:
服务端想客户端发送消息时使用 客户端收到消息后用该秘钥解密 - 客户端告诉服务端我要使用加密通信了
- finished 将前几步数据综合加密进行HAMC计算后发给服务端(秘钥除外)
- 服务端告诉客户端我要使用加密通信了
- finished 将前几步数据综合加密进行HAMC(hash-based message authenticate code)计算后发给客户端(秘钥除外)
问题
- 为什么加密方式使用对称加密?
非对称加密计算量大,加密效率不如对称加密 - 对称加密秘钥为什么分为客户端秘钥与服务端秘钥
防止消息被人拦截后原样发送给消息发送者 - 为什么要使用随机数生成Pre-master secret而不是固定数字
防止重放攻击 消息被人劫持后 当客户端与服务端断开连接后 劫持者再次将该消息发往服务端 每次连接的建立都会生成新的随机数会使之前的验证失效
网友评论