HTTPS TLS/SSL层握手
HTTPS基于SSL/TLS协议实现HTTP协议,是在传输层(TCP协议)和应用层(HTTP协议)之间增加安全传输层。TLS/SSL负责HTTP协议传输的内容加密、通信双方身份验证等
openssl工具可以生成HTTPS Web服务所需的server.key和server.crt
安全传输层握手过程
image.png
1.客户端向服务端发起连接,向服务端提供本地最新TLS版本、支持的加密算法组合的集合(比如ECDHE-RSA-AES128-GCM-SHA256组合)以及随机数等。
2.ServerHello & Server certificate &ServerKeyExchange(服务端 → 客户端)
a.收到ClientHello请求后,用发来信息与自己支持TLS版本、加密算法组合集合做比较,选一个TLS版本和加密算法组合,生成一个随机数,一起打包到ServerHello中回给客户端
b.服务器将服务端公钥证书发送给客户端(Server certificate),公钥证书身兼两大职责:客户端对服务端身份的验证,后续双方会话密钥的协商和生成
c.双方开启会话密钥协商的请求(ServerKeyExchange),服务端会向客户端发送密钥交换算法的相关参数信息。通常使用到Diffie-Hellman(DH)密钥协商协议让双方在不安全通道上生成对称加密算法所需的共享密钥
最后,服务端以Server Finished(又称为ServerDone)结束通信
3.ServerChangeCipher & Finished(服务端 → 客户端)
客户端收到公钥证书后对服务端身份进行验证(可选不验证),如通过那客户端从证书中提取服务端公钥,用于加密后续协商密钥时发送给服务端的信息。
如服务端要求对客户端进行身份验证(接到服务端发送的CertificateRequest请求),客户端需通过ClientCertificate将自己公钥证书发送给服务端进行验证。
客户端收到对称加密共享密钥协商的请求后,根据之前的随机数、确定的加密算法组合加服务端发来的参数计算出最终的会话密钥,后将服务端计算会话密钥所需信息用服务端公钥加密后以ClientKeyExchange请求发送给服务端。随后客户端用ClientChangeCipher通知服务端从现在开始发送的消息都是加密过的
最后,随着ClientChangeCipher消息会有一个Finished消息来验证双方的对称加密共享密钥协商是否成功。验证方法是通过协商的新共享密钥和对称加密算法对一段特定内容进行加密,以服务端能否正确解密来判定。被加密内容是连接至今的全部报文内容
Finished报文作为该轮通信的结束标志,也是客户端发出的第一条使用协商密钥加密的信息
4.ServerChangeCipher & Finished(服务端 → 客户端)
服务端收到ClientKeyExchange中的参数后,将算出会话密钥。服务端用ServerChangeCipher通知客户端从现在开始发送的消息都是加密过的
最后,服务端用Finished消息跟在ServerChangeCipher后面,用于标识该轮握手结束和验证对方计算出的共享密钥是否有效。这是服务端发出的第一条使用协商密钥加密信息。一旦HTTPS安全传输层的连接成功建立起来,后续双方通信的内容(应用层的HTTP协议)就在一个经过加密处理的安全通道中传输