HTTPS工作原理

HTTPS是什么

HTTPS全称为Hypertext Transfer Protocol over Secure Socket Layer,及以安全为目标的HTTP通道,简单说就是HTTP的安全版本。

HTTPS其实是由两部分组成的:HTTP+TLS/SSL,即HTTP下加入TLS/SSL层,HTTPS的安全基础就是TLS/SSL。服务端和客户端的信息传输都会通过TLS/SSL进行加密,所以传输的数据都是加密之后的数据。TLS的前身就是SSL协议,因此没有特别说明TLS/SSL说的都是同一个东西。

 

HTTP在安全方面的缺陷

HTTP本身是明文传输的,没有经过任何安全处理。例如用户在百度搜索了一个关键字,比如"苹果手机",中间者完全能够查到到这个信息,并且有可能打电话过来骚扰用户。也有一些用户投诉使用百度时,发现首页或者结果页浮了一个很长很大的广告,这也肯定是中间者往页面插的广告内容。如果劫持技术比较低劣的话,用户甚至无法访问百度。

这里提到的一些中间者主要指一些网络节点,使用户数据在浏览器和百度服务器之间传输必须要经过的节点,比如WIFI热点、路由器、防火墙、反向代理、缓存服务器等。

在HTTP协议下,中间者可以随意嗅探用户搜索内容,窃取隐私甚至篡改网页。不过HTTPS是这些劫持行为的克星,能够完全有效地防御。总体来说,HTTPS协议提供了三个强大的功能来对抗上述的劫持行为:

1、内容加密。浏览器到百度服务器的内容都是以加密形式传输的,中间者无法直接查看原始内容

2、身份认证。保证用户访问的是百度服务,即使被DNS劫持到了第三方站点,也会提醒用户没有访问百度服务

3、数据完整。防止内容被第三方冒充或篡改

 

HTTPS工作原理

用一张图表示一下HTTPS的工作原理,来自http://blog.csdn.net/sean_cd/article/details/6966130,这位网友将基本的HTTPS工作原理已经总结得挺好了,我在此文的基础上再做一些补充:

其工作过程大致是:

1、客户端发起HTTPS请求

浏览器里面输入一个HTTPS网址,然后连接到服务端的443端口上。注意这个过程中客户端会发送一个密文族给服务端,密文族是浏览器所支持的加密算法的清单。

2、服务端配置

采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。

这套证书其实就是一对公钥和私钥,可以这么理解,公钥就是一把锁头,私钥就是这把锁的钥匙,锁头可以给别人对某个东西进行加锁,但是加锁完毕之后,只有持有这把锁的钥匙才可以解锁看到加锁的内容。

前面说过客户端会传送密文族给服务端,服务端则会从这些密文族中,挑选出一个,比如百度吧:

采用的就是RSA公钥加密算法来区分证书签名和交换密钥,通过AES算法来加密数据,至于GCM,应该是用来校验信息的

3、传送证书

这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构、过期时间等等。

4、客户端解析证书

这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,如颁发机构、过期时间等等,如果发现异常则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密。

注意一下上面提到的"发现异常"。证书中会包含数字签名,该数字签名是加密过的,是用颁发机构的私钥对本证书的公钥、名称及其他信息做hash散列加密而生成的。客户端浏览器会首先找到该证书的根证书颁发机构,如果有,则用该根证书的公钥解密服务器下发的证书,如果不能正常解密,则就是"发现异常",说明该证书是伪造的。

5、传送加密信息

这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,然后客户端和服务端的通信就可以通过这个随机值来进行加密和解密了。

6、服务端解密信息

服务端用私钥解密后,得到了客户端传过来的随机值,至此一个非对称加密的过程结束,看到TLS利用非对称加密实现了身份认证和密钥协商。然后把内容通过该值进行对称加密。

7、传输加密后的信息

这部分是服务端用随机值加密后的信息,可以在客户端被还原。

8、客户端解密信息

客户端用之前生成的随机值解密服务端传送过来的信息,于是获取了解密后的内容,至此一个对称加密的过程结束,看到对称加密是用于对服务器待传送给客户端的数据进行加密用的。整个过程即使第三方监听了数据,也束手无策。

 

证书

下面对上述过程中的一些细节做解释,首先是第二点中提到了证书,证书其实就是服务器自己的一套身份信息,客户端拿到证书之后会首先验证证书的合法性,如颁发证书的机构是否合法、证书中包含的网站地址是否与正在访问的地址一致等,如果证书受信任,则浏览器栏里面会显示一个小锁头,否则则会给出证书不受信的提示。以百度为例,一个受信的证书应该在浏览器上是这样的

关于证书,还是以百度、天猫为例,看一下它们的证书:

看到百度的证书使用的是VeriSign颁发的证书,颁发给baidu.com,并标明了有效期。VeriSign是一个提供智能信息基础设施服务的上市公司,数字证书业务则是其起家的核心业务。再看天猫的证书:

天猫使用的证书则是GlobalSign颁发的,颁发给*.tmall.com。GlobalSign同样是一家声誉卓著、备受信赖的CA中心和SSL数字证书提供商。再看一下百度的证书的具体信息:

从证书信息中看到了加密算法和具体的公钥。

 

如何由HTTP变为HTTPS

我们在浏览器中输入http://www.baidu.com/会自动跳转至https://www.baidu.com/,看下是怎么做到的,截三张图就明白了:

看到302就很明显了,response里面的Location表示后一个要请求的页面,因此百度使用的方法是对http://www.baidu.com/这个地址做了一次的重定向,这应该是最简单、最容易想到的方法,实现也方便,做一个过滤器就好了。

不过用同样的方法看一下天猫网站,似乎不是这样做的:

并没有发起重定向,我猜想可能是利用了负载均衡将请求http变为了https。

posted @ 2015-12-27 23:17  五月的仓颉  阅读(8835)  评论(4编辑  收藏  举报