Secure Hypertext Transfer Protocol
-
组成
tcp-008.jpg
TLS/SSL
- Transport Layer Security/Secure Sockets Layer
- 介于TCP和HTTP之间的一层安全协议
-
不影响原有的TCP协议和HTTP协议
tcp-009.jpg
PKI体系(Public Key Infrastructure)
-
RSA验证隐患
- 中间人攻击
- 公钥本身不包含服务器信息,所以无法验证
- 中间者M截获了C和S的通信,把自己的公钥发给了C,那么C的信息就泄露了
- 信息抵赖
-
S可以不承认自己曾发过的信息
tcp-010.jpg
-
- 中间人攻击
-
CA证书体系
- CA:第三方权威机构
- CA证书一般都是操作系统预置的
-
自签CA证书(非权威证书机构签发)存在安全隐患
tcp-011.jpg
-
证书链
- 优势
- 减少根证书工作量
- 降低根证书私钥泄露风险
- 若中间证书私钥泄露,根证书可以快速吊销它
-
证书链四级内一般不会对性能造成明显影响
tcp-012.jpg
- 优势
- 证书吊销
- CRL(Certificate Revocation List)
- 一个单独文件,包含已吊销证书序列号和吊销日期;包含生效日期和下次更新日期;包含CA私钥的签名
- 不频繁更新,成本低但不及时
- 证书中一般会包含CRL Distribution Point(url),告知使用者去哪下载CRL以验证证书
- OCSP(Online Certificate Status Protocol)
- 实时查询,需要查询服务器性能好
- CRL(Certificate Revocation List)
SSL握手
-
握手与密钥协商
tcp-014.jpg- client_hello
- TLS版本:SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,低于TLSv1已基本不用
- 加密套件候选列表
- 认证算法:身份验证
- 密钥交换算法:密钥协商
- 对称加密算法:信息加密
- 信息摘要:完整性校验
- 压缩算法候选列表
- 客户端随机数
- 扩展字段,如SNI
- server_hello+server_certificate+server_hello_done
- server_hello
- 选中的TLS版本,加密套件,压缩算法
- 服务端随机数
- 扩展字段
- server_certificate
- 服务器证书
- server_hello_done
- 通知客户端server_hello发送结束
- server_hello
- 证书校验
- 证书链可信性
- 是否吊销
- 有效期
- 域名匹配
- client_key_exchange+change_cipher_spec+encrypted_handshake_message
- client_key_exchange
- Pre-master随机数,用证书公钥加密后发送
- enc_key=Fuc(random_C, random_S, Pre-master)
- change_cipher_spec
- 确认信号:告诉服务端采用协商的密钥和加密算法
- encrypted_handshake_message
- 将当前所有通信参数hash,结合其他信息,用协商密钥session secret加密发送服务端
- client_key_exchange
- change_cipher_spec+encrypted_handshake_message
- 私钥解密得到Pre-master
- enc_key=Fuc(random_C, random_S, Pre-master)
- 计算当前所有接收信息的hash,用协商密钥解密encrypted_handshake_message,进行比对
- change_cipher_spec
- 确认信号:告诉服务端采用协商的密钥和加密算法
- encrypted_handshake_message
- 也结合当前所有通信参数的hash,用协商密钥加密发送客户端
- 握手结束
- 计算当前所有接收信息的hash,用协商密钥解密encrypted_handshake_message,进行比对;验证通过则握手完成
- 加密通信
- 基于协商密钥的对称加密通信
- client_hello
-
会话缓存握手
-
加快握手,减少协议带来的性能降低和资源消耗
-
分会话标识Session ID与会话记录Session Ticket两种机制
tcp-015.jpg -
虽然握手过程有1.5个来回,但是客户端向服务器发送的第一条应用数据不需要等待服务器返回的信息,因此握手延时是1*RTT(Round-Trip Time,TCP往返时延)
-
会话标识Session ID
- 首次握手成功,服务器返回Session ID,并缓存信息
- 客户端在client_hello中携带Session ID
- 服务器根据Session ID检索缓存,如果没有检索到或者缓存失效,则重新握手
- 若检索到,则发送确认信号以及加密消息
- 客户端确认加密消息,确认通过则也发送确认信号和加密消息
- 服务器也验证通过,则握手成功
-
会话记录Session Ticket
- 首次握手成功,服务器发送的new_session_ticket中包含加密数据session_ticket,客户端保存
- 客户端在client_hello中携带session_ticket
- 服务器解密session_ticket,解密失败则重新握手
- 若解密成功,则发送确认信号和加密消息
- 客户端确认加密消息,确认通过则也发送确认信号和加密消息
- 服务器也验证通过,则握手成功
-
-
重建连接
-
服务器发起重建连接
- 已经建立TLS连接
- 客户端访问受保护数据
- 服务端发送hello_request
-
客户端发送client_hello开始重新连接
tcp-016.jpg
-
客户端重建连接
- 已建立TLS连接
- 客户端需要更新密钥,主动发出client_hello
- 服务端收到client_hello时并不马上清楚这是重建连接信号,会交给下一步处理
- 确定重建连接前,服务端可能还会继续发送缓存数据,但是客户端不会再发送任何数据
- 服务端确定重建连接,发送server_hello
- 客户端同样无法立即判断这是重建消息,交给下一步处理,处理后返回通知是重建消息
-
重建连接
tcp-017.jpg
-
-
密钥计算
tcp-018.jpg-
key计算
- 客户端采用RSA或Diffie-Hellman等加密算法生成 Pre-master
- Pre-master结合random client和random server通过 PseudoRandomFunction(PRF)计算得到Master secret
- Master secret结合random client和random server 通过迭代计算得到Key material
- 说明
-
Pre-master前两个字节是TLS 的版本号,这是一个比较重要的用来核对握手数据的版本号,因为在 Client Hello 阶段,客户端会发送一份加密套件列表和当前支持的 SSL/TLS的版本号给服务端,而且是使用明文传送的,如果握手的数据包被破解,攻击者很有可能串改数据包,选择一个安全性较低的加密套件和版本给服务端,从而对数据进行破解。所以,服务端需要对密文中解密出来的 Pre-master中TLS版本号与之前Client Hello 阶段的版本号进行对比,如果版本号变低,说明被篡改,则立即停止发送任何消息
tcp-019.jpg
-
-
密钥使用
- Key经过12轮迭代运算得到12个hash值,组成6个元素
- mac key,encryption key,IV是一组加密元素,分别给client和server使用
- 双向通信使用不同密钥,破解需要两次
-
-
抓包分析
HTTPS性能与优化
- 性能损耗
- 增加延时
- 消耗较多的CPU资源
- 优化
- CDN
- 会话缓存
- SSL硬件加速卡
- 远程解密
- SPDY/HTTP2(修改了HTTP协议)
网友评论