HTTPS可以理解为,在原来HTTP协议基础上加了一个安全层(TLS/SSL),这个安全层的作用是,对客户端和服务端数据做身份校验(确认是否是,已经建立好连接的客户端,或者服务端发过来的)和数据加密(防止被第三方窃取或伪造)。
请求过程中涉及到三个角色:客户端、CA机构、服务端;
请求具体过程:
1、客户端(比如浏览器)发出请求行/请求头/请求体(GET方式发送一个数据包,POS T发送两个),如下面的格式:
1)请求行(请求报文的第一行):
GET /index.html HTTP/1.1
2)请求头:
Host: hr.tencent.com (请求的域名)
Accept-Encoding: gzip (客户端支持的编码格式)
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6, (客户端支持的语言)
Cookie: pgv_pvi=2098703360; PHPSESSID=bc7onl0dojbsatscsfv79pds77; (客户端保存过的cookie数据)
......
3)请求体(跟请求头之间空一行)
【随机字符串rand1 + 客户端支持的TLS/SSL的版本 + 加密算法 】构成的加密串
2、服务端请求后,获取到资源,并回复响应行/响应头/响应体,格式如下:
1)响应行(响应报文的第一行):
HTTP/1.1 200 OK
2)响应头:
Server: Apache Tomcat/5.0.12 (服务器的类型和版本)
Date:Mon,6Oct2003 13:13:33 GMT (响应的时间)
......
- 响应体(跟响应头之间空一行);
数字证书和随机字符串rand2的加密串A (注意,这里的加密串是CA证书加密后保存在服务器的)
3、客户端接受响应后,先使用浏览器自带的CA证书(一般下载的浏览器自带有常用的CA证书)解密接受到的加密串A,得到服务器的公钥、摘要信息B、域名等。
4、客户端将解密后的摘要信息B用 CA自带的公钥解密,得到加密串C;然后使用hash算法对服务器公钥加密得到加密传D,比较加密串C和D是否一致,如果一致,说明数字证书有效,身份认证通过;
5、如果身份认证通过,客户端会生成随机字符串rand3,使用服务器的公钥加密随机字符串rand3得到加密串E,并返回给服务端;如果认证未通过,则返回提示证书问题;
6、服务端接收后,使用自己的私钥解密加密串E,得到随机字符串rand3,然后将之前接受的rand1,和自己生成的rand2一起,这三个随机字符串,经过hash加密得到最终的密钥key1;
7、服务端使用密钥key加密html文件,并响应给客户端;
8、客户端使用之前从服务器接收到的rand2,以及自己生成的rand1和rand3,三个随机字符串一起通过hash加密得到密钥key2,得到的key2和服务器生成的密钥key1一致;
9、客户端使用密钥key2解密接收到的html加密串,得到html原文内容,并通过浏览器渲染出来;
10、客户端后续的请求,发送到服务器,服务器响应后的内容,都是经过key1加密过的,返回过来,客户端都使用key2解密;
11、服务端断开链接,会话结束;