Web 观察1次ssl单向认证过程
SSL
ssl 的基础知识,趁最近的项目又再熟悉下:
单向的意思是仅客户端验证服务端证书,而不需要客户端也给证书给服务端去验证.
wireshark 抓取, 访问微信 webapi
wx.qq.com/jslogin
协议:TLSv1.2
Client hello
random: 生成会话密钥用 Cipher suites:声明支持的算法
Server hello,Certificate,Server Key Exchange, Server Hello done
Server hello
Cipher Suite:回应采用的算法 random:用于生成会话密钥
Certificate
服务器证书给客户端,
Server Key exchange
server 端 ECDH 的参数,DH 算法是密钥交换算法,给对方参数是必要的
使用 ECDH 交换密钥和 RSA 公钥证书加密发送密钥是一样的效果,如果之前是 RSA,就没有这步,后续直接 Client Key Exchage 就够了
Server Hello done
server hello 结束
Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
Client Key Exchange
ECDH,客户端给参数给服务端,用于交换密钥
RSA 证书, 则会用证书公钥加密会话密钥
Change Cipher Spec
前面说的会话密钥,在这真正使用.
客户端通知服务器开始使用加密方式发送报文。客户端使用上面的 3 个随机数 client random, server random, pre-master secret, 计算出 48 字节的 master secret, 这个就是用于加解密的对称加密算法的会话密钥。
服务端按此方法可计算出同样的会话密钥.
Encrypted Handshake Message
客户端发送第一个加密报文。使用 HMAC 算法计算收到和发送的所有握手消息的摘要,然后通过 RFC5246 中定义的一个伪函数 PRF 计算出结果,加密后发送。
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。
2:服务器在握手过程中,如果支持 session ticket,则发送 New session ticket 类型的握手报文,其中包含了能够恢复包括主密钥在内的会话信息,当然,最简单的就是只发送 master key。为了让中间人不可见,这个 session ticket 部分会进行编码、加密等操作。
3:客户端收到这个 session ticket,就把当前的 master key 和这个 ticket 组成一对键值保存起来。服务器无需保存任何会话信息,客户端也无需知道 session ticket 具体表示什么。
4:当客户端尝试会话复用时,会在 client hello 的拓展中加上 session ticket,然后服务器收到 session ticket,回去进行解密、解码能相关操作,来恢复会话信息。如果能够恢复会话信息,那么久提取会话信息的主密钥进行后续的操作。
session ticket