- 客户端向服务器发送支持的SSL/TSL的协议版本号,以及客户端支持的加密方法,和一个客户端生成的随机数
- 服务器确认协议版本和加密方法,向客户端发送一个由服务器生成的随机数,以及数字证书
- 客户端验证证书是否有效,有效则从证书中取出公钥,生成一个随机数,然后用公钥加密这个随机数,发给服务器
- 服务器用私钥解密,获取发来的随机数
- 客户端和服务器根据约定好的加密方法,使用前面生成的三个随机数,生成对话密钥,用来加密接下来的整个对话过程
数字证书
数字证书包括 公钥和数字签名 公钥通过hash算法可以得到数据摘要,数据摘要使用CA的私钥加密得到数字签名。
客户端拿到数字证书之后,使用CA的公钥解密数字摘要,然后使用服务端的公钥hash值做对比,正确则通过校验。
检验时 把数字证书中的公钥通过hash算法得到的消息摘要以及数字前面通过CA公钥解密得到的消息摘要进行对比
每次进行HTTPS请求时都必须在SSL/TLS层进行握手传输密钥吗?
这也是我当时的困惑之一,显然每次请求都经历一次密钥传输过程非常耗时,那怎么达到只传输一次呢?
服务器会为每个浏览器(或客户端软件)维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!