HTTPS
https是http的安全版本,由两个部分组成:HTTP+TLS/SSL,即在http下加入TLS/SSL层,HTTPS的安全基础就是TLS/SSL。客户端和服务端的信息通信会通过TLS/SSL进行加密,所以传输的数据都是加密后的数据。TLS的前身是SSL。
http的缺陷
http本身是明文传输的,没有经过任何安全处理,比如用户在百度搜索一个关键字,中间者完全可以获得这个信息。
这里提到的中间者主要是指一些网络节点,使用户在浏览器和百度服务器建必须经过的节点。比如wifi热点,路由器,防火墙,反向代理,缓存服务器等。
https协议可以有效的防止上述的劫持行为:
1.内容加密,浏览器到百度服务器的内容都是加密形式传输的,中间者无法直接查看原始内容。
2.身份认证。保证用户访问的是百度服务,即使被DNS劫持到了第三方站点,也会提醒用户没有访问百度服务。
3.数据完整。防止内容被冒充和或篡改。
HTTPS工作原理
其工作过程大致是:
1.客户端发起https请求
浏览器里面输入一个https的网址,然后连接到服务端的443端口上。这个过程中客户端会发送一个密文族给客户端,密文族是浏览器支持的加密算法清单。
2.服务端配置
采用https协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。
这套证书就是一对公钥和私钥,公钥是把锁,私钥是钥匙。锁头可以给别人对某个东西加锁,但是加锁完毕,至于这把锁的钥匙才可以解锁。
前面说过客户端会传送密文族给服务端,服务端则会从这些密文族中,挑选出一个,比如百度吧:
采用的就是RSA公钥加密算法来区分证书签名和交换密钥,通过AES算法来加密数据,至于GCM,应该是用来校验信息的
3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构、过期时间等等。
4、客户端解析证书
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,如颁发机构、过期时间等等,如果发现异常则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密。
注意一下上面提到的"发现异常"。证书中会包含数字签名,该数字签名是加密过的,是用颁发机构的私钥对本证书的公钥、名称及其他信息做hash散列加密而生成的。客户端浏览器会首先找到该证书的根证书颁发机构,如果有,则用该根证书的公钥解密服务器下发的证书,如果不能正常解密,则就是"发现异常",说明该证书是伪造的。
5、传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,然后客户端和服务端的通信就可以通过这个随机值来进行加密和解密了。
6、服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值,至此一个非对称加密的过程结束,看到TLS利用非对称加密实现了身份认证和密钥协商。然后把内容通过该值进行对称加密。
7、传输加密后的信息
这部分是服务端用随机值加密后的信息,可以在客户端被还原。
8、客户端解密信息
客户端用之前生成的随机值解密服务端传送过来的信息,于是获取了解密后的内容,至此一个对称加密的过程结束,看到对称加密是用于对服务器待传送给客户端的数据进行加密用的。整个过程即使第三方监听了数据,也束手无策。
如何由HTTP变为HTTPS
我们在浏览器中输入http://www.baidu.com/会自动跳转至https://www.baidu.com/,看下是怎么做到的,截三张图就明白了:
看到302就很明显了,response里面的Location表示后一个要请求的页面,因此百度使用的方法是对http://www.baidu.com/这个地址做了一次的重定向,这应该是最简单、最容易想到的方法,实现也方便,做一个过滤器就好了。
不过用同样的方法看一下天猫网站,似乎不是这样做的:
并没有发起重定向,我猜想可能是利用了负载均衡将请求http变为了https。