图解HTTPS基本原理

8,168 阅读5分钟

一图胜千言

diagrammatize-https

开局一张图,内容全靠编(手动狗头.jpg)。本文不打算长篇大论去讲解各种HTTPS相关的理论知识,只是综合网上各位大佬们的HTTPS详解,作一个简短的要点总结。水平有限,如有疏漏之处欢迎指正。

什么是HTTPS?

HTTPS = HTTP + SSL/TLS,是HTTP协议的安全版。

SSL/TLS又是什么?

SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。SSL最新的版本是3.0。

TLS的全称是Transport Layer Security,即安全传输层协议,是建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。

SSL/TLS = 非对称加密(如RSA、ECC) + 对称加密(如AES、DES) + 散列算法(如MD5)

为什么要用HTTPS?

因为HTTP在“裸奔”(明文传输,不安全)。

HTTPS的作用

  • 对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全
  • 对网站服务器进行真实身份认证

图解文字说明

①:一般【客户端】首先发起请求,例如请求网站www.thinktxt.com/, 生成一个随机数(RandomC),携带支持的TLS版本、加密算法等信息发送至【服务端】。

②:【服务端】收到请求,返回证书、一个随机数(RandomS)、协商加密算法。

③:【客户端】拿到证书后开始进行校验,验证其合法性。客户端通过本地浏览器或操作系统内置的权威第三方认证机构的CA证书进行验证,一个证书包含域名、证书编号、公钥、有效期等信息,证书编号是在服务器管理员通过第三方证书机构申请证书的时候,第三方机构用他们的私钥对证书编号进行加密存入证书,根据编号生成方法生成证书编号(证书本身携带了生成证书编号的方法),与CA证书公钥解密得出的证书编号进行对比,验证不通过或者证书过期等情况就提示存在风险(浏览器的红色警告),验证通过则进行下一步。

④:【客户端】生成一个随机数(PreMaster Key),此时已经有第三个随机数了,根据三个随机数(RandomC、RandomS、PreMaster Key)按照双方约定的算法生成用于后面会话的同一把的“会话密钥”。

⑤:【客户端】将随机数(PreMaster Key)通过公钥加密后发送至【服务端】。

⑥:【服务端】收到密文后用私钥进行解密,得到随机数(PreMaster Key),此时服务端也拥有了三个随机数,根据三个随机数按照事先约定的加密算法生成用于后面会话的同一把的“会话密钥”。

⑦:【服务端】计算此前所有内容的握手消息hash值,并用“会话密钥”加密后发送至客户端用于验证。

⑧:【客户端】解密并计算握手消息的hash值,如果与服务端发来的hash一致,此时握手过程结束。

⑨:验证通过后,开始正常的加密通信。

一些要点问答

证书从哪申请?需要钱吗?

证书由服务器管理员从第三方证书机构申请,知名的证书机构有:Symantec、GeoTrust、GMO GlobalSign等,需要钱的,也有一些免费或限免的,如Let's Encrypt、TrustAsia等。

申请证书需要提供哪些信息?

向证书机构提交公钥、组织信息、个人信息(域名)等信息并申请认证,申请证书不需要提供私钥,确保私钥永远只能服务器掌握。

证书包含哪些信息?

证书 = 公钥 + 申请者与颁发者信息 + 数字签名

数字签名是什么?

数字签名其实就是我们上面为了简单理解所说的证书编号,主要是用来证明证书和发送方的真实性,解决报文可能遭篡改的问题。

证书机构具体对比的是哪两个证书编号?

上面我们说到证书编号其实就是为了防止证书被篡改,证书机构给证书生成的数字签名。就好比你的毕业证书,为了保证唯一性,教育局给你的毕业证书上编一个唯一的证书编号,并且盖章。HR为了验证你的毕业证书真实性,可以通过学信网输入证书编号查询验真伪。

一个证书只有一个证书编号。证书里面自带了生成证书编号的方法,CA证书根据方法生成一个数字签名,再去通过CA证书自己的公钥去解密(颁发证书时证书机构会用自己的私钥加密数字签名)证书中的签名密文得到数字签名,如果证书是真实有效的,这两个数字签名理论上就是一致的。

客户端怎么去证书机构验证呢?

证书机构的CA证书内置在浏览器或操作系统中,也就是客户端本地,称之为CA根证书。

CA证书如果放在远程,那这又涉及到请求,又会有被中间人篡改的风险,所以浏览器内置了一些知名证书机构的CA根证书,客户端根据颁发者信息去找到对应的CA证书进行验证。