HTTP的缺点:
- 通信使用明文,内容可能会被窃听。
- HTTP不对通信方的身份进行验证,可能会有非法的伪装。
- 无法证明报文的完整性,报文有可能会被篡改。
其实,如果只按照TCP/IP协议族的工作机制,通信内容在所有的通信线路上都有可能遭到窥视。
我们无法确定请求发送至目标的web服务器是否是按照真实意图返回响应的那台服务器。
无法确定响应返回到的客户端是否是按照真实意图接收响应的那个客户端,有可能是已伪装的客户端
无法确定正在通信的对方是否具备访问权限。
无法阻止海量垃圾信息的攻击。
那么如何来解决HTTP的这些问题呢?
查明对方的证书
虽然使用HTTP无法确定通信方,但是使用SSL协议则可以。
SSL不仅能够提供加密处理,还使用了一种被称之为证书的手段,能够用来确认通信方。
证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。
伪造证书在技术角度来说是异常困难的事情。
流程:
客户端在开始通信之前先确认服务器的证书
用证书确认目标服务器不是被伪造的服务器
通过使用证书,以证明通信方就是意料之中的服务器。
而且,只要客户端拥有证书就可以完成个人身份的确认。
使用HTTPS:
HTTP是什么?
HTTPS=HTTP+加密+认证+完整性保护
HTTPS并非是一种新协议,只是用SSL协议和TLS协议来代替HTTPS的接口部分
通常,HTTP是直接与TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。
简而言之,所谓的HTTPS,其实就是身披SSL协议这层外壳的HTTP。
相互交换密钥的公开密钥加密技术
在SSL之前,我们必须了解一下SSL的加密方式:公开密钥加密。
近代的加密方法中加密算法是公开的,而密钥是保密的,加密和解密的过程都需要这个密钥。也可以这么说,任何人只要持有密钥就可以解密。
加密和解密共用一个密钥的通信方式叫做共享加密通信,也被叫做对称密钥加密。
在共享密钥方式加密时,必须将密钥发给对方。但是这里就出现了严重的安全问题:
在互联网上转发密钥时,如果通信被监听,那么密钥就会落入攻击者之手,所以还有对这个密钥传递的过程进行额外的保护。
发送密钥就有被窃听的风险,但是如果不发送,对方就不可能解密,再者说,如果密钥能够安全的传输,那么你的通信主体也应该可以安全的传输到对方。
所以,这时就出现了使用两把密钥的公开密钥加密。
公开密钥加密使用一对非对称的密钥。一把叫做公开密钥,一把叫做私有密钥,私有密钥不能让任何人知道,而公开密钥则可以随意发布,任何人都可以获取。
使用公开密钥加密方式,发送密文的一方则可以使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密,利用这种方式,不需要发送用来解密的私有密钥。
而且我们要知道,如果想根据密文和公开密钥,想要恢复到信息原文是异常困难的,解密的过程是对离散对数进行求值,就目前的技术,强行解密不太现实。
但是,HTTPS采用的却是混合加密机制,使得共享密钥加密和公开密钥加密两者并用的混合加密机制,公开密钥加密还有一个缺点:它的处理速度比共享密钥加密,其处理速度要慢。很多人说这是使用混合加密机制的主要原因,《图解HTTP》一书中也是这么写的,但是实际上,这个原因是微不足道的,在绝对的安全面前,效率落入下风,一旦能够绝对安全,各种辅助速度的产品肯定会出现,所以,真正使得只是用公开密钥加密方式进行加密的理由是:服务端的私有密钥并不保险。是不是很迷惑,我们之前说过了,私有密钥是接收方自己使用的,不对外界开放的,这是我们前面介绍公开密钥加密的大前提,但是,我们必须要知道的是,对于一家员工基数庞大的公司来说,员工的个人行为是不可完全掌控的,员工一旦将私有密钥泄露,那么接下来的加密通信就没有了意义。
所以HTTPS充分利用两者各自的优势,将多种方法组合起来用于通信:在交换密钥的环节使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
也就是说,接收方仍有私有密钥和公开密钥两种密钥,公开密钥可以随便传送,私有密钥则只在接收方使用,不对外界开放。这是公共密钥加密的部分,在通信开始之前,发送方与接收方通过公开密钥加密来互相传递接下来通信建立起来后的共享密钥。
我们再来思考一下,在发送方与接收方通过公开密钥加密进行交换接下来通信密钥时,我们怎么能够确定我们手中接收方的公开密钥是正确的,这是一个问题。
为了防止真正的公开密钥在通信过程中已经被替换了,我们可以使用数字证书认证机构和其相关机关颁发的公开密钥证书。
数字证书认证机构是客户端与服务器双方都可信赖的第三方机构。
首先,服务器的运营人员向数字证书认证机构提供公开密钥的申请。数字证书认证机构在辨别申请者的身份后,会对已申请的公开密钥做数字签名,然后分配这个已签名的公开密钥,并将这个公开密钥放入公钥证书绑定在一起。
服务器会将这份由数字证书认证机构颁发的公钥证书发送给客户端,以公开密钥加密方式通信。收到证书的客户端可使用数字证书认证机构颁发的公开密钥对证书上面的数字签名进行验证,一旦验证通过,那么客户端就知道了,该服务器的公开密钥是真实有效且值得信赖的。
那么认证机构的公开密钥又要如何安全的转交给客户端呢,为了解决这个问题,多数浏览器会在内部植入常用认证机关的公开密钥。
EV SSL证书:
证书的一个作用是用来证明作为通信一方的服务器是否规范,另外一个作用是可确认对方服务器背后运营的企业是否真实存在,EV SSL证书就能够起到这样的一个作用。
EV SSL证书严格规定了对运营机构是否真实的确认方针,所以,通过认证的Web网站能够获得更高的认可度。
客户端证书:
HTTPS中还可以使用客户端证书。以客户端证书进行客户端认证,证明服务器正在通信的对方始终是预料之内的客户端。
但是在客户端证书的获取方面还是有一些问题,比如当客户端想要获取证书时,用户得自行安装客户端证书,而客户端证书价格不菲,对于普通用户来说,让他们花这么多钱买客户端签名并不现实。
所以,目前客户端证书的现状是,证书只用在特殊的业务,例如银行,在线下银行中,登录不仅需要用户输入ID和密码,还会要求用户的客户端证书,以来确认用户时候是从特定的终端来访问网银,银行中的每一台终端都会有这样一个客户端证书。
但是客户端证书也存在着其自身的缺点:客户端证书只能用来证明客户端实际存在,而不能用来证明用户本人的真实有效性,也就是不能确定你这个人是不是你本人,只要获得了安装有客户端证书的计算机权限,也就意味着有人客户端证书的使用权限。
HTTPS的安全通信机制:
- 客户端发送Hello报文开始SSL通信,报文中包括客户端支持的SSL的指定版本、所使用的的加密算法以及密钥长度,也就是加密组件。
- 服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件,这报文中的加密组件是根据客户端报文中的加密组件筛选出来的。
- 之后服务器发送Certificate报文,报文中包含公开密钥证书,
- 最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束。
- SSL第一次握手结束后,客户端以Client Key Exchange报文作为回应。报文中包含通信加密使用的一种被称为Pre-master secret的随机字符串,这个内容已经通过公开密钥证书对应的公开密钥进行加密。
- 接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会使用Pre-master secret密钥加密。
- 客户端发送Finished报文,该报文包含连接至今全部报文的整体校验值,这次握手是否能够成功,要以服务器能否成功解密该密文作为标准。
- 服务器发送的Change Cipher Spec报文
- 服务器发送Finished报文
- 服务器和客户端的Finished报文交换完毕之后,SSL连接就算是建立完成。从此,使用应用层协议进行通讯。
在以上流程中,应用层发送数据时会附加一种叫做MAC的报文摘要,MAC能够査知报文是否遭到篡改,从而保护报文的完整性。
SSL的速度:
SSL无疑是很慢的,一是指通信慢,二是指由于大量消耗CPU及内存等资源,导致处理速度变慢。
针对SSL速度的变慢,没有根本性的解决方案,但是可以使用SSL加速器这种硬件来改善该问题。
为什么不一直使用HTTPS?
跟普通HTTP相比,HTTPS加密通信会消耗更多的CPU及内存资源,所以,如果是非敏感信息可以直接用HTTP通信,只有在包含个人信息等敏感数据时,才使用HTTPS来加密通信。