Q:为什么要用https?
A:因为http有以下问题:
- 通信使用明文(不加密),内容可能被窃听
- 不验证通信方的身份,因此可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
补充:
- 当然这不仅是http的问题,其它应用层协议都可能有这些问题,比如websocket(简写ws),它加上ssl后就是wss。
- 内容被窃听可能发生在互联网上的各种中间设备(路由器、代理服务器等)
- 通过ssl加密后的报文仍然可能被窃听,只不过报文被加密而非明文,此时窃听者无法获取有效信息
客户端、服务端、CA(认证机构)三方之间的联系
-
服务端向CA机构申请证书的流程 第3步证书中的“数字签名”很重要,它可以确保证书被篡改后能被发现。数字签名函数主要是做了2件事:先对明文信息计算摘要(这里应该跟etag计算方法类似,还有webpack计算文件hash值应该也是类似。当然这是个人粗浅理解,如有错误请帮忙指出);再对摘要使用CA的私钥进行加密得到签名。
具体实现逻辑先看完下图。
-
浏览器发送"https"请求时的流程 1 ) 先进行tcp3次握手
2 ) 再进行ssl握手,ssl握手可以分为4大步(2个rtt) 9小步
这里主要讲解下拿到证书后做的事情:
1. 先对证书中的明文进行摘要计算(跟上图中计算摘要步骤一样);
2. 再用CA的公钥对数字签名进行解密,得到上图中计算的摘要;
3. 再对这两个摘要进行对比,如果一致说明证书没有被篡改;
4. 最后再验证证书的其它信息
3 ) ssl握手之后,进行http通信。使用ssl握手过程中产生的对称密钥进行加密。(这里使用对称密钥是因为其加解密相对非对称密钥更节省时间及内存资源)
参考资料: 1.《图解HTTP》 2.《HTTP权威指南》