SSL

ssl 的基础知识,趁最近的项目又再熟悉下:

单向的意思是仅客户端验证服务端证书,而不需要客户端也给证书给服务端去验证.

wireshark 抓取, 访问微信 webapi

wx.qq.com/jslogin

协议:TLSv1.2

Client hello

random: 生成会话密钥用 Cipher suites:声明支持的算法

Screenshot from 2018-11-16 14-07-42-6cd17f55-76e0-40a1-8469-e8e8b7244d64

Server hello,Certificate,Server Key Exchange, Server Hello done

Server hello

Cipher Suite:回应采用的算法 random:用于生成会话密钥

Screenshot from 2018-11-16 14-10-02-d73affe6-1b69-4b4f-9b6b-030fb8a7791d

Certificate

服务器证书给客户端,

Screenshot from 2018-11-16 14-12-05-2b82810e-f9aa-470c-ad34-0347ca86e042

Server Key exchange

server 端 ECDH 的参数,DH 算法是密钥交换算法,给对方参数是必要的

使用 ECDH 交换密钥和 RSA 公钥证书加密发送密钥是一样的效果,如果之前是 RSA,就没有这步,后续直接 Client Key Exchage 就够了

Screenshot from 2018-11-16 14-13-48-8b50fc55-3525-4ce8-a1c0-808a7829f1f0

Server Hello done

server hello 结束

Screenshot from 2018-11-16 14-15-50-70088d7e-8f3f-470d-8491-013f5b4d51ef

Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message

Client Key Exchange

ECDH,客户端给参数给服务端,用于交换密钥

Screenshot from 2018-11-16 14-17-54-be2e84d7-21a3-4ba9-b65e-4a33c6bec6e2

RSA 证书, 则会用证书公钥加密会话密钥

Change Cipher Spec

前面说的会话密钥,在这真正使用.

客户端通知服务器开始使用加密方式发送报文。客户端使用上面的 3 个随机数 client random, server random, pre-master secret, 计算出 48 字节的 master secret, 这个就是用于加解密的对称加密算法的会话密钥。

服务端按此方法可计算出同样的会话密钥.

Screenshot from 2018-11-16 14-21-57-2212ff07-6012-45d4-ba14-8540a6bec335

Encrypted Handshake Message

客户端发送第一个加密报文。使用 HMAC 算法计算收到和发送的所有握手消息的摘要,然后通过 RFC5246 中定义的一个伪函数 PRF 计算出结果,加密后发送。

Screenshot from 2018-11-16 14-22-33-dbac19c0-9754-4e6f-9013-12b881599fc9

New Session Ticket, Change Cipher Spec, Encrypted Handshake Message

服务端完成和客户端类似的 Change Cipher Spec, Encrypted Handshake Message 动作.

SSL Session Ticket 机制

前面的握手太复杂,如果密钥失效了每次,都重新握手,挺麻烦.

引入类似 web 中 cookie 和 session 的机制.

特别注意最后 server 端发了个 New Session Ticket! 它怎么来的?

1:客户端发起 client hello,拓展中带上空的 session ticket TLS,表明自己支持 session ticket。

Screenshot from 2018-11-16 14-58-55-d107104b-bcd5-4d74-94e0-580b536f0a9e

2:服务器在握手过程中,如果支持 session ticket,则发送 New session ticket 类型的握手报文,其中包含了能够恢复包括主密钥在内的会话信息,当然,最简单的就是只发送 master key。为了让中间人不可见,这个 session ticket 部分会进行编码、加密等操作。

Screenshot from 2018-11-16 15-02-31-58cc468c-c910-464a-8838-fa4efda6a7fb

3:客户端收到这个 session ticket,就把当前的 master key 和这个 ticket 组成一对键值保存起来。服务器无需保存任何会话信息,客户端也无需知道 session ticket 具体表示什么。

4:当客户端尝试会话复用时,会在 client hello 的拓展中加上 session ticket,然后服务器收到 session ticket,回去进行解密、解码能相关操作,来恢复会话信息。如果能够恢复会话信息,那么久提取会话信息的主密钥进行后续的操作。

session ticket