TLS四个核心主协议:
- handshake protocol 握手协议
- change cipher spec protocol 密钥规格变更协议
- application data protocol 应用数据协议
- alert protocol 警报协议
- record协议:包括对消息的分段、压缩、消息认证和完整性保护、加密
SSL核心功能:握手、密钥交换、相互认证、保密数据传输
SSL握手的三个目的:
- 客户端与服务器就一组保护数据的算法达成一致
- 确立一组由算法使用的密钥
- 还可以选择对客户端身份进行认证
由于SSL/TLS协议自身特性(数字证书),不能被用于保护多跳端到端通信,只能保护点到点通信。
SSL/TLS协议能够提供的安全目标:
- 身份认证(数字证书)
- 机密传输(信息加密)
- 数据完整性(MAC)
- 重放保护(通过使用隐式序列号防止重放攻击)
1. SSL总体流程
- 客户端将其支持的算法列表和一个用作密钥生成算法输入的随机数发送给服务器
- 服务器选择一个加密算法,并将其和包含服务器公钥的证书发送给客户端,还包括一个用作密钥生成算法输入的随机数
- 客户端验证服务器证书,并抽取服务器公钥。同时生成一个pre_master_secret随即密码串,然后使用服务器公钥对其进行加密,将加密的信息发送给服务器
- 客户端和服务器根据pre_master_secret和随机数值独立计算加密密钥和MAC密钥
- 客户端将所有握手消息MAC值加密后发送给服务器
- 服务器将所有握手消息MAC值加密后发送给客户端
2. SSL连接
- 握手消息ClientHello,用于告知服务器客服端所支持的密码套件种类、最高SSL/TLS协议版本以及压缩算法。还包括一个客户端生成的用于密钥产生的随机数,在密钥生成过程中被使用(其它有Session值,第一次握手为0;版本号)
- 服务器返回的一系列握手消息。首先是ServerHello,包含了服务器选择的加密参数。还包括一个服务器生成的用于密钥产生的随机数,如果是第一次握手,服务器将提供给客户端一个Session值用于恢复使用已经协商好的密钥信息
- 服务器发送Certificate,该消息是X.509证书序列,证书依序提供,从服务器证书开始,到Certificate authority或者最新的自签名证书结束。同时证书会附带携带与协商的密钥交换算法对应的密钥。客户端除了校验签名信息,还要保证证书链中的所有证书均未被吊销。
- ServerHelloDone,表示服务器已发送在此阶段要发送的全部信息。此项告诉客户端本次Certificate后面没有可选信息,不用再等了
- ClientKeyExchange客户端验证了服务端证书并并抽取公钥后,使用服务器公钥对生成的被称为pre_master_secret的随机密钥串加密,再通过此消息发送
- ChangeCipherSpec告诉服务器,客户端之后的消息都是用商定的加密算法,此消息不属于握手消息,
- Finished 发送前一阶段的所有握手消息MAC值,对握手消息校验,这样服务器可以判断使用的加密算法是否是安全商定的,而没有遭到中间人篡改或诱导
- ChangeCipherSpec告诉客户端,服务器之后的消息都使用商定的加密算法
- Finished
2.1 ClientHello
结构体:
struct {
ProtocolVersion client_version;
Random random;
SessionlD session_id;
CipherSuite cipher_suites<2..2^16-1>;
CompressionMethod compression_methods<l..2^8-1>;
} ClientHello;
struct {
uint8 major;
uint8 minor;
} ProtocolVersion;
struct {
uint32 gmt_unix_time;
opaque random_bytes[28]