开局一张图,内容全靠编(手动狗头.jpg)。本文不打算长篇大论去讲解各类HTTPS相关的理论知识,只是综合网上各位大佬们的HTTPS详解,做一个简短的要点总结。水平有限,若有疏漏之处欢迎指正。算法
HTTPS = HTTP + SSL/TLS,是HTTP协议的安全版。浏览器
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通讯提供安全及数据完整性的一种安全协议。SSL最新的版本是3.0。安全
TLS的全称是Transport Layer Security,即安全传输层协议,是创建在SSL 3.0协议规范之上,是SSL 3.0的后续版本。服务器
SSL/TLS = 非对称加密(如RSA、ECC) + 对称加密(如AES、DES) + 散列算法(如MD5)网络
由于HTTP在“裸奔”(明文传输,不安全)。dom
①:通常【客户端】首先发起请求,例如请求网站www.thinktxt.com/, 生成一个随机数(RandomC),携带支持的TLS版本、加密算法等信息发送至【服务端】。网站
②:【服务端】收到请求,返回证书、一个随机数(RandomS)、协商加密算法。加密
③:【客户端】拿到证书后开始进行校验,验证其合法性。客户端经过本地浏览器或操做系统内置的权威第三方认证机构的CA证书进行验证,一个证书包含域名、证书编号、公钥、有效期等信息,证书编号是在服务器管理员经过第三方证书机构申请证书的时候,第三方机构用他们的私钥对证书编号进行加密存入证书,根据编号生成方法生成证书编号(证书自己携带了生成证书编号的方法),与CA证书公钥解密得出的证书编号进行对比,验证不经过或者证书过时等状况就提示存在风险(浏览器的红色警告),验证经过则进行下一步。操作系统
④:【客户端】生成一个随机数(PreMaster Key),此时已经有第三个随机数了,根据三个随机数(RandomC、RandomS、PreMaster Key)按照双方约定的算法生成用于后面会话的同一把的“会话密钥”。cdn
⑤:【客户端】将随机数(PreMaster Key)经过公钥加密后发送至【服务端】。
⑥:【服务端】收到密文后用私钥进行解密,获得随机数(PreMaster Key),此时服务端也拥有了三个随机数,根据三个随机数按照事先约定的加密算法生成用于后面会话的同一把的“会话密钥”。
⑦:【服务端】计算此前全部内容的握手消息hash值,并用“会话密钥”加密后发送至客户端用于验证。
⑧:【客户端】解密并计算握手消息的hash值,若是与服务端发来的hash一致,此时握手过程结束。
⑨:验证经过后,开始正常的加密通讯。
证书由服务器管理员从第三方证书机构申请,知名的证书机构有:Symantec、GeoTrust、GMO GlobalSign等,须要钱的,也有一些免费或限免的,如Let's Encrypt、TrustAsia等。
向证书机构提交公钥、组织信息、我的信息(域名)等信息并申请认证,申请证书不须要提供私钥,确保私钥永远只能服务器掌握。
证书 = 公钥 + 申请者与颁发者信息 + 数字签名
数字签名其实就是咱们上面为了简单理解所说的证书编号,主要是用来证实证书和发送方的真实性,解决报文可能遭篡改的问题。
上面咱们说到证书编号其实就是为了防止证书被篡改,证书机构给证书生成的数字签名。就比如你的毕业证书,为了保证惟一性,教育局给你的毕业证书上编一个惟一的证书编号,而且盖章。HR为了验证你的毕业证书真实性,能够经过学信网输入证书编号查询验真伪。
一个证书只有一个证书编号。证书里面自带了生成证书编号的方法,CA证书根据方法生成一个数字签名,再去经过CA证书本身的公钥去解密(颁发证书时证书机构会用本身的私钥加密数字签名)证书中的签名密文获得数字签名,若是证书是真实有效的,这两个数字签名理论上就是一致的。
证书机构的CA证书内置在浏览器或操做系统中,也就是客户端本地,称之为CA根证书。
CA证书若是放在远程,那这又涉及到请求,又会有被中间人篡改的风险,因此浏览器内置了一些知名证书机构的CA根证书,客户端根据颁发者信息去找到对应的CA证书进行验证。