接上篇,HTTPS是现代平常使用十分频繁的HTTP相关技术,但自己原理上与HTTP的关系并不大,而且可讲内容也比较多,故独立成单独一章讲解。web
HTTPS全称Secure Hypertext Transfer Protocol(安全超文本传输协议),是一个安全通讯通道,用于在客户计算机和服务器之间交换信息。它使用安全套接字层进行信息交换,简单来讲它是HTTP的安全版,是使用TLS/SSL加密的HTTP协议。算法
HTTPS = HTTP + TLS/SSL
HTTP协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险,而协议TLS/SSL具备身份验证、信息加密和完整性校验的功能,能够避免此类问题发生。
TLS全称Transport Layer Security(安全传输层协议), 前身是SSL,故如今用TLS/SSL统称。是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,因此使用HTTPS基本上不须要对HTTP页面进行太多的改造。浏览器
套用在TCP/IP四层模型里的结构以下:缓存
TLS/SSL的功能实现主要依赖于三类基本算法:散列函数(Hash)、对称加密和非对称加密。
其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。安全
TLS/SSL = 非对称加密 + 对称加密 + 散列算法
加密和解密使用不一样密钥的加密算法,也称为公私钥加密。密钥成对出现,通常称为公钥(publickey)和私钥(privatekey),公钥加密的信息只能私钥解开,私钥加密的信息只能公钥解开。即服务器持有私钥,客户端持有公钥,客户端要发送的信息通过公钥加密后传递给服务器,服务器用私钥解密获得明文信息。服务器
特色:session
在TLS/SSL中,非对称加密仅用于“身份认证”和“密钥协商”,不在后续正文数据传输中使用,这是安全性与性能之间的平衡取舍。并发
加密和解密使用相同密钥的加密算法。即客户端与服务器所持有的密钥是相同的,客户端要发送的信息通过密钥加密后传递给服务器,服务器用相同密钥解密获得明文信息。dom
特色:函数
在TLS/SSL中,对称加密的密钥是经过非对称加密的“密钥协商”产生的,这样就最大限度的保证了密钥的安全。因为其效率高的特色,正文数据传输使用了该加密方式。
一种将任意长度的消息压缩到某一固定长度的消息摘要的函数,经常使用于防止信息篡改并验证数据的完整性。
特色:
在信息传输过程当中,散列函数不能单独实现信息防篡改,由于明文传输,中间人能够修改信息以后从新计算信息摘要,所以须要对传输的信息以及信息摘要进行加密。
在TLS/SSL中,“密钥协商”的最后步骤和传输正文信息都会带上散列函数计算出的信息摘要,他们一块儿通过对称加密后传输,用来验证完整性。
前面讲到“身份验证”和“密钥协商”是TLS/SSL的基础功能,要求的前提是合法的服务器掌握着对应的私钥。但非对称加密算法没法确保服务器身份的合法性,由于公钥并不包含服务器的信息。
假定出现如下的状况:
如图,中间节点M和服务器S之间再创建合法的链接,所以C和S之间通讯被M彻底掌握,M能够进行信息的窃听、篡改等操做,这类攻击被称为“中间人攻击”。
为了解决上述的隐患,关键是确保获取公钥途径是合法的,可以验证服务器的身份信息,为此须要引入权威的第三方机构CA。
CA全称Certificate Authority(证书颁发机构),它负责核实公钥的拥有者的信息,并颁发认证"证书",同时可以为使用者提供证书验证服务,即PKI体系。
证书 = 公钥 + 申请者与颁发者信息 + 有效时间 + 域名信息 + 签名
CA认证流程以下:
客户端会内置信任CA的证书信息(包含公钥),若是CA不被信任,则找不到对应CA的证书,证书也会被断定非法。
也能够这样理解,网站千千万,浏览器厂商没办法一家一家去认证,因而跟CA合做,经过维护一个CA列表,只要网站有通过这个列表里CA的认证,就能够信任该网站的证书。
TLS/SSL握手过程也就是所谓的HTTPS四次握手(不含证书验证步骤)。
细分为四步:
细分为四步:
示意图以下:
在TLS/SSL协商第二阶段,也就是浏览器生成最后一个随机数并用公钥加密发送给服务器后,当即发送加密的应用层数据,而无需等待服务器的确认。
若是用户的一个业务请求包含了多条的加密流,客户端与服务器要反复握手,一定致使更多的时间损耗。或某些特殊状况致使会话中断,须要从新握手。
服务器为每一次的会话生成并记录一个sessionId,发送给客户端,客户端从新链接只须要提供这个id,不须要从新握手。
OCSP全称Online Certificate Status Protocol。由web服务器向OCSP server周期性地查询证书状态,得到一个带有时间戳和签名的OCSP response并缓存它。当有客户端发起请求时,web服务器会把这个response在TLS握手过程当中发给客户端。
(谷歌浏览器默认只使用内置列表检查,故这个优化对谷歌无效)
一个报文头部字段,告诉浏览器,接下来的一段时间内,当前域名(及其子域名)的后续通讯应该强制性使用HTTPS,直到超过有效期为止。
形如:
Strict-Transport-Security: max-age=31536000;includeSubDomains