HTTPS = HTTP + 认证 + 加密 + 完整性保护
HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 安全套接字层(SSL)和 安全传输层协议(TLS )代替而已。即添加了加密及认证机制的 HTTP 称为 HTTPS ( HTTP Secure )。
具体传输过程(也叫握手过程)
第一步:
客户端发起明文请求:将自己支持的一套加密规则、以及一个随机数(Random_C)发送给服务器
第二步:
服务器选出一组加密规则和hash算法,并将自己的身份信息以证书(CA:包含网站地址、加密公钥、证书颁发机构等信息)和一个随机数(Random_S)发给客户端
第三步:
验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等)。如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
如果证书受信任,或者是用户接受了不受信的证书,客户端做以下事情:
- 生成密码:浏览器会生成一串随机数的密码(Pre_master),并用CA证书里的公钥加密(enc_pre_master),用于传给服务器。
- 计算协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master)
- 生成握手信息:使用约定好的HASH计算握手消息,并使用协商密钥enc_key及约定好的算法对消息进行加密。
- 发送以下信息到服务器:
- 用公钥加密过的服务器随机数密码enc_pre_master
- 客户端发给服务器的通知,"以后我们都要用约定好的算法和协商密钥进行通信的哦"。
- 客户端加密生成的握手信息。
第四步:
服务器接收客户端发来的数据要做以下四件事情:
- 私钥解密:使用自己的私钥从接收到的enc_pre_master中解密取出密码Pre_master。
- 计算协商密钥:enc_key=Fuc(random_C, random_S, Pre-Master)
- 解密握手消息:使用协商密钥enc_key解密客户端发来的握手消息,并验证HASH是否与客户端发来的一致。
- 生成握手消息使用协商密钥enc_key及约定好的算法加密一段握手消息,发送给客户端。这里要发的数据有两条:
- 服务器发给客户端的通知,”听你的,以后我们就用约定好的算法和协商密钥进行通信哦“。
- 服务器加密生成的握手信息。
第五步:
客户端拿到握手信息解密,握手结束。
客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。
第六步:
正常加密通信,握手成功之后,所有的通信数据将由之前协商密钥enc_key及约定好的算法进行加密解密。
这里浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码和hash算法,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。
从握手过程,我们可以得知:
- 通过CA可以确认网站的合法性
- 通过enc_key来加密解密,在传输过程中,为了保证enc_key不被解破,在客户端用公钥加密后,在服务器端用私钥解密,私钥只有服务器端有,所以即使报文被截获,也无法破解。
- hash算法确保报文的完整性
具体的hash算法大家可以去看看这篇文章: