HTTP (HyperText Transfer Protocol
,超文本传输协议) 是因特网上应用最为普遍的一种网络传输协议,全部的WWW
文件都必须遵照这个标准。算法
HTTP
协议是明文传输协议,通讯过程当中被中间人进行劫持、监听、篡改,会形成我的隐私泄露等严重的安全问题segmentfault
在传输层和应用层加了
TSL/SSL
浏览器
Client
->Server
经过密钥进行发送方加密、接收方解密安全
问题?如何安全传输密钥,密钥被中间人劫持,一切加密解密都是浪费时间服务器
也叫公开密钥加密,有私钥和公钥网络
Client
发送消息给Server
,Client
用Server
的公钥进行加密,server用本身的私钥进行解密,反之亦然。若是咱们使用非对称加密传输数据,会有以下问题:session
客户端如何获取服务器的公钥?dom
Server
发送本身的公钥给Client
,中间人H
拿到Server
的公钥,而后发送本身的公钥给client
。Client
用H
的公钥进行加密,发给Server
,中间人H劫持到消息,用本身的私钥进行解密,而后用server
的公钥进行加密,发送给Server
,Server
用本身的私钥进行解密,获得消息。Client
、Server
都以为消息在正常传输,可是已经被中间人劫持了。CA
(Certificate Authority
证书颁发机构)Server
把本身的公钥、域名等信息发送给CA
CA
拿到后用本身的私钥进行加密Client
,中间人不是同样能够劫持吗?。鸡生蛋,蛋生鸡的悖论了。Client
收到数字证书后,从数字证书中找到权威机构的信息,从本地找到权威机构的公钥,就能正确解密Server
的公钥。若是不校验,中间人也能够向权威机构申请数字证书,而后劫持
Server
发送的证书,而后发送本身的数字证书给Client
,Client
接受到后,用本地的公钥解密,拿到中间人的公钥。函数
Server
的公钥,机构信息,还包括了证书内容的签名、签名计算方法、证书对应的域名签名 等于
Server
的公钥、其余信息经过HASH
函数计算获得证书的数字摘要,权威机构的私钥加密获得数字签名网络传输协议
Client
使用公钥解密,获得服务器的公钥、证书的数字签名、签名计算方法。从新计算签名,对比签名是否一致。判断证书是否被中间人篡改。Client
就没法用CA
的本地公钥进行解密。Server
发送证书给Client
,中间人直接替换成本身的证书,Client
用本地权威机构的公钥解密,对比证书签名也没问题。可是Client
检查证书中的域名和当前访问的是否一致。不一致也会发出警告。HTTPS
通讯过程Client
发送Client Hello
报文给Server
开启SSL
通讯,报文中包含Random_1
服务器支持SSL
通讯的话,发送Server Hello
报文回应,报文中包含Random_2
服务器以后发送Certificate
报文,报文中包含数字证书
服务器再发送Server Hello Done
通知Client
,最初的SSL
握手阶段协商部分结束
Client
对数字证书校验,正确后,解密获得服务器的公钥。经过RSA
算法随机生成Pre-Master Secret
,而且用服务器的公钥进行加密,包含在Client Key Exchange
报文中,发送给Server
客户端继续发送Change Cipher Spec
报文,告知Server
端,客户端切换协商的加密套件,准备使用协商的加密套件加密数据并传输。
Client
发送Finished
报文,该报文包含了链接至今所有报文的总体校验值(也就是hash
值)
Server
接收到Client
的请求,用私钥解密,把Pre-master secret
取出来。Server
发送一样的Change Cipher Spec
报文
Server
一样发送Finished
报文,提供Client
校验
Server
和Client
的Finished
报文交换完毕,SLL
链接创建。开始通讯。
Client
和Server
都经过Random_1
、andom_2
、Pre-Master Secret
三个随机数,经过伪随机函数PRF
生成Master Secret
。再根据master secret
推导出hash secret
和sesson secret
hash secret
对HTTP
报文作一次运算生成一个MAC
,附在HTTP
报文的后面,而后用session-secret
加密全部数据(HTTP+MAC
),而后发送。session-secret
解密数据,而后获得HTTP+MAC
,再用相同的算法计算出本身的MAC
,若是两个MAC
相等,证实数据没有被篡改。pre-master secret
自己就是一个随机数,再加上Hello
和Server
消息中的随机,三个随机数经过一个密钥导出器最终导出一个对称密钥Server
接收到重复的随机数,能够中断通讯。