HTTPS 协议的主要功能基本都依赖于 TLS/SSL 协议,TLS/SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
HTTPS完整建立连接过程,如下图
1.首先建立tcp握手连接2.进行ssl协议的握手密钥交换(Handshake protocal)3.然后通过共同约定的密钥开始通信
SSL 密钥协商的过程如下:
(一)、client_hello 过程
客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:
1.版本信息: 支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本2.加密套件候选列表(cipher suite): 认证算法 Au (身份验证)、密钥交换算法 KeyExchange(密钥协商)、对称加密算法 Enc (信息加密)和信息摘要 Mac(完整性校验);3.压缩算法候选列表:支持的压缩算法 compression methods 列表,用于后续的信息压缩传输;4.随机数:随机数就是上图里的RNc,用于后续生成协商密钥;5.协商数据:支持协议与算法的相关参数以及其它辅助信息等,常见的 SNI 就属于扩展字段,后续单独讨论该字段作用。
(二)、server_hello 过程
1.服务端返回协商的信息结果,包括选择使用的协议版本version,选择的加密套件 cipher suite,选择的压缩算法 compression method、随机数 RNs等,其中随机数用于后续的密钥协商;2.服务器证书链,用于身份校验和密钥交换3.通知客户端server-hello结束,请求客户端的证书和密钥
(三)、证书校验,协商最后通信密钥
客户端验证服务端证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:
1.证书链的可信性 trusted certificate path2.证书是否吊销 revocation3.有效期 expiry date,证书是否在有效时间范围;4.a. 域名 domain,核查证书域名是否与当前的访问域名匹配,匹配规则后续分析; b. 客户端发送客户端证书,公钥服务端验证(过程同客户端验证) c. 客户端hash所有之前的消息,发送hash值和摘要,用客户端的私钥加密发送给服务端,服务端用客户端的公钥解密,验证了服务端获取的客户端的公钥和算法是正确的 d. 客户端生成pms,用服务端的公钥加密后发送给服务端 e. 客户端和服务端同时计算出最终会话密钥(MS)
(四)、 验证协商密钥
1.Client发送ChangeCipherSpec,指示Server从现在开始发送的消息都是加密过的2.Client发送Finishd,包含了前面所有握手消息的hash,可以让server验证握手过程是否被第三方篡改3.服务端发送ChangeCipherSpec,指示Client从现在开始发送的消息都是加密过的4.Server发送Finishd,包含了前面所有握手消息的hash,可以让client验证握手过程是否被第三方篡改,并且证明自己是Certificate密钥的拥有者,即证明自己的身份。