HTTP有以下三个缺点:无加密,无身份认证,无完整性保护,因此所谓的HTTPS,它其实就是HTTP+加密+身份认证+完整性保护。HTTPS并不是一种新的协议,在通信接口使用了SSL和TLS协议而已。HTTP通常直接和TCP通信,而HTTPS中HTTP先和SSL通信,再由SSL和TCP进行通信。模型如下
需要注意的是,SSL协议并不是一个应用层协议,它是介于应用层和传输层协议之间的一个安全协议。
对称密钥加密
SSL采用对称密钥进行加密,所谓的对称密钥,就是加密和解密都用同一个密钥,因此也叫做共享密钥加密。
但是这种方法也有一个弊端,一旦密钥被第三方获得了,就可以对数据进行解密并窃取,因此这并不是一个完全安全的方法。事实上,如果加密解密方法十分简单,是很容易被第三方截取的。
所以这种方法的缺陷就在于,如果一方不发送密钥,对方就无法利用密钥解密。另外,如果发送了密钥,但是密钥被第三方截取了,数据就容易被窃取。因此,需要一种方式,能够保证该密钥能够确保送到对方手中并且还不能够让第三方截取。
非对称密钥加密
SSL还采用了一种技术就是非对称密钥加密,所谓的非对称密钥,就是这是一对密钥,一个是私钥,一个是公钥。私钥不能让其他任何人知道,而公钥可以随意发布,任何人都可以获得到,因此这种加密方式也叫公开密钥加密。
它的原理是这样的:
客户端向服务器发起请求,服务器创建一对非对称密钥,将公有私钥返回给可客户端,自己保留着这个私钥而不发送。
客户端收到了来自服务器的公钥,于是将自己的数据通过公钥加密,并返回给服务器
服务器接收到了客户端的数据,因为使用自己发送的公钥加密的,因此用自己的私钥对其进行解密,拿到数据
即使第三方拿到了加密后的数据,因为没有私钥,因此也无法获取到真实的数据。假如想要破解这个解密方式,是十分困难的。
HTTPS使用两种加密方式的混合加密
对称密钥加密方式的优缺点:
优点:处理速度快
缺点:但是容易被第三方盗取
非对称密钥加密方式的优缺点:
优点:更加安全,不容易被盗取
缺点:处理效率相比对称密钥加密要慢,如果在通信时用这种方式加密,效率很低
于是HTTPS采用了两者的优点,使用了混合加密的方式
使用非对称密钥加密的方式安全地交换再稍后对称密钥加密中要使用的密钥
确保交换的密钥是安全的之后,放弃非对称密钥加密,使用对称密钥加密来进行通信,保证传输效率
HTTPS使用的各种证书
证明公开密钥正确性的数字证书
客户端无法判断自己收到的服务器的公钥是否是正确的,是否在服务器发送给客户端的过程中被第三方篡改了。
为了解决上面的问题,服务器可以使用由数字证书认证机构(CA)颁发的证书,这种机构是客户端和服务器双方的第三方机构。服务器获取证书的流程如下:
服务器运营人员向CA提出公开密钥的申请
CA在判明申请者的身份之后,会对已申请的公开密钥做数字签名,然后将这个签名的公开密钥和放入公钥证书分配给服务器公司
服务器会把这个由CA颁发的公钥证书以及公开密钥发送给客户端,以此来和客户端进行通信
接收到证书的客户端可以使用公开密钥对证书上的签名进行认证,一旦认证通过,客户端就可以知道认证服务器公开密钥的是真实有效的CA,并且服务器的公开密钥是值得信赖的
CA的公开密钥已经事先植入到浏览器中,客户端通过CA的公开密钥向CA认证服务器的公钥证书上的数字签名的真实性。
证明企业真实性的EV SSL证书
该证书用来验证服务器背后运营的企业的合法性
用以确认客户端的客户端证书
该证书用来向服务器证明,与之通信的客户单是预料之内的客户端。
想要获取证书 时,用户得自行安装客户端证书,但是客户端证书是要付费买的。
因为成本比较大,因此只有某些特定的业务,如网上银行等,就需要使用客户端证书。
HTTPS是怎么解决HTTP协议的三大缺点的?
防监听:采用对称加密对数据进行加密,采用非对称加密对对称加密的密钥进行加密
防伪装:通信双方携带证书,证书有第三方颁发,很难伪造
防篡改:采用摘要算法(MD5或是SHA-1),同样的数据由同样的摘要,而只要有一点不同的数据,它的摘要往往不同,只要数据做了篡改,就会被感知到。
HTTPS的通信流程
客户端向服务器发起SSL通信,报文中包含客户端支持的SSL的指定版本,加密组件列表(所使用的加密算法及密钥长度)
服务器的响应报文中,包含SSL版本以及加密组件,服务器的加密组件内容是从客户端发来的加密组件列表中筛选出来的,服务器还会发一个公开密钥并且带有公钥证书
客户端拿到服务器的公开密钥,并验证其公钥证书(使用浏览器中已经植入的CA公开密钥)
如果验证成功,客户端生成一个Pre-master secret随机密码串,这个随机密码串其实就是之后通信要用的对称密钥,并用服务器的公开密钥进行加密,发送给服务器,以此通知服务器,之后的报文都会通过这个对称密钥来加密
同时,客户端用约定好的hash算法计算握手消息,然后用生成的密钥进行加密,一起发送给服务器
服务器收到客户端发来的的公开密钥加密的对称密钥,用自己的私钥对其解密拿到对称密钥,再用对称密钥解析握手消息,验证hash值是否与客户端发来的一致。如果一致,则通知客户端SSL握手成功
之后的数据交互都是HTTP通信(当然通信会获得SSL保护),且数据都是通过对称密钥来加密(这个密钥不会每次都发,在握手的过程中,服务器已经知道了这个对称密钥,再有数据来时,服务器知道这些数据就是通过对称密钥加密的,于是就直接解密了)
一:网络协议HHTP
超文本传输协议
RFC2616
二:HTTP报文主要结构
1)Request
Method(get,post) —请求方式
URL——-请求地址
Header——请求头
Body——–请求体
2)Response
Status Code——-状态码
Header——–响应头
Body——–响应体
三:HTTP状态码
200:成功,这个成功只是表示服务器正常处理完成了,并不能表示逻辑的正确性
301,320:跳转,一般可以在header中看到location,即跳转地址,区别是一个是临时跳转一个是固定跳转
304:未修改,服务器发现资源文件标识未变动,通知客户端读取本地缓存文件即可
400:客户端请求信息格式问题
403:一般是禁止访问,比如文件,目录等存在,但做了访问限制
404:一般为文件,目录不存在,但也可以将其他情况伪装成为不存在
500:出现这个一般都是服务端的代码直接抛出异常导致
502,503,504:这个类似,在网络异常等情况下都可以出现,也有很多代码抛出错误时候出现
四:HTTP常规Header信息与作用(Request)
Host:必须存在,域名指定(类似与分类,但端口用于区分访问那个域名)
Accept:表示自身可接受的信息类容,类似建议,有子项
User-Agent:客户端标识信息(系统版本,浏览器,内核等)
Cookie:特殊的信息存储位置,用于自动交互,无需代码干涉
Referer:来源,即通过什么页面或文件触发的请求,如果是浏览器地址栏回车则没有该值
Connection:控制长短链接,告诉对方当前链接状态(Keep-Alive,Close)
Range:指定返回信息范围(断点持续子类使用)
Content-Type:请求正文的类型,编码等信息
Content-Length:请求正文长度
If-Modifiled-Since:缓存相关,本地文件的标识有效期
If-None-Match:缓存相关,本地文件的特征码,对应返回信息中的ETag
五:HTTP常规Header信息与作用(Reaponse)
Date:时间,一般是服务器当前时间
Content-Encoding:返回正文的压缩编码类型
Content-Length:返回正文的长度
Content-Type:返回正文的类型,编码等信息
Cache-Control:缓存机制以及策略,时间,方式等
Etag:返回文件信息的特征码
Expires:返回文件信息的缓存有限期
Set-Cookie:要求设置的Cookie,可以多次出现的头信息
Location:自动重定向到其他新的地址,一般状态301,302时会出现
Connection:控制长短链接,告诉对方当前链接状态,默认Keep,当双方都为Keep时则链接会在下次沿用
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。
HTTPS解决的问题:
1 . 信任主机的问题.
采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任此主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server.
2 . 通讯过程中的数据的泄密和被窜改
一般意义上的https, 就是 server 有一个证书.
a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.
b) 服务端和客户端之间的所有通讯,都是加密的.
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.
ii. 所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然窜改也就没有什么意义了.
2). 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说别人无法模拟的,所有这样能够更深的确认自己的身份.
b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体.
3.HTTPS 一定是繁琐的.
a) 本来简单的http协议,一个get一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返.
i. 任何应用中,过多的round trip 肯定影响性能.
b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密.
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.
ii. 加密后数据量的影响. 所以,才会出现那么多的安全认证提示