HTTP是Web中常见的通信方式,无状态,简单易用。当然,它的不足之处也非常明显:
- 通信使用明文,内容可能被窃听
- 不验证通信方的身份,有可能遭遇伪装
- 无法证明报文的完整性,所以报文有可能被篡改
为了解决HTTP协议的痛点,采用通信加密的方式,继而出现HTTPS协议。
1. HTTPS
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。
服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
1.1 SSL加密
- SSL是Netscape公司所提出的安全保密协议,在浏览器(如Internet Explorer、Netscape Navigator)和Web服务器(如Netscape的Netscape Enterprise Server、ColdFusion Server等等)之间构造安全通道来进行数据传输
- SSL运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道
- 采用了RC4、MD5以及RSA等加密算法,使用40 位的密钥,适用于商业信息的加密。
- Netscape公司相应开发了HTTPS协议并内置于其浏览器中,HTTPS实际上就是SSL over HTTP,它使用默认端口443,而不是像HTTP那样使用端口80来和TCP/IP进行通信。
- HTTPS协议使用SSL在发送方把原始数据进行加密,然后在接受方进行解密,加密和解密需要发送方和接受方通过交换共知的密钥来实现,因此,所传送的数据不容易被网络黑客截获和解密。
加密技术有两种:
- 公开密钥加密(非对称密钥加密):加密算法是公开的,而密钥是保密的.加密和解密都会用到密钥(使用一对非对称的密钥,一把私钥一把公钥)。
- 共享密钥加密(对称密钥加密):以共享密钥方式加密时必须将密钥也发给对方。
https采用共享密钥加密和公开密钥加密两者并用的混合加密机制,具体加密方式参考第二节。
SSL不仅提供加密处理,而且使用证书,来确定对方的非伪装的。
1.2 数字证书
证书是由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。
2. HTTPS 通信步骤
HTTP+加密+认证+完整性保护=HTTPS
。上节提到,“https采用共享密钥加密和公开密钥加密两者并用的混合加密机制”,解释一下,就是用公开密钥加密传递密钥,用共享密钥加密算法加密报文内容。
为什么HTTPS要采用混合加密呢?
因为公开密钥加密的处理速度要远远慢于共享密钥加密,所以,在通信最频繁的环节 - “报文加密”,采用了共享密钥。那么,更加安全的公开密钥加密,就非常适合“报文密钥”的传递来。
具体加密,解密,验证步骤如下:
-
客户端发起HTTPS请求
用户在浏览器里输入一个https网址,然后连接到server的443端口(默认HTTP的端口号为80,HTTPS的端口号为443)。 -
服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。
这套证书其实就是一对公钥和私钥。 -
传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。 -
客户端解析证书
这部分工作是有客户端的TLS来完成的。
首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书没有问题,那么就生成一个随即值。然后用证书对该随机值进行加密。 -
传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。 -
服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。
所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。 -
传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原 -
客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策