在一般情况下我们上网采用的超文本传输协议为http协议,https协议的全称为Hypertext Transfer Protocol over Secure Socket Layer,相比http多了一个Secure,简单来说就是http的安全版。
由于http是以明文方式发送内容,不提供任何加密,因此当攻击者截获了web浏览器和网站服务器之间的传输报文,就可以读取其中的信息,用户就可能泄露自己的敏感信息,如支付密码,身份证号等等。那么为了解决这个问题,网景公司最早提出了SSL协议,在http的基础上加入了SSL协议,SSL依靠证书来为浏览器和服务器之间的通信加密。
那么http与https的主要区别有哪些呢。
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
那么https是如何工作的呢
这里只做简单的说明,详细内容可以参考http://www.moserware.com/2009/06/first-few-milliseconds-of-https.html
在http握手之后,要进行SSL握手,分为以下四步
1.首先客户使用https的url访问服务器,要求与服务器建立安全连接。这时候就需要客户端与服务器协商我们接下来的加密应该怎么做。客户端先告诉服务器,我的浏览器支持哪些加密方法,我的版本是什么,等等。然后服务器知道了之后,从客户端支持的加密方法中随机选择一种,然后告诉客户端。
2.这时候就会有一个问题,网站怎么证明自己是一个清白的网站,这就需要一个公认的证书来证明自己的清白,就是certification,这个证书是由CA颁布的,CA的证书上有它的签名,如果用户信任这个证书而遭到了损失,是可以通过这个证书追求法律责任的。这时候服务器就把证书和公钥发送给了用户。那公钥又是什么呢,这个是由于安全过程采用了密钥交换算法,这个交换算法需要这一步骤。
3.客户收到了证书与密钥之后,第一步要向服务器证明自己也是清白的(这一步可选),也发送一个自己的证书信息,第二步是浏览器生成会话密钥并用公钥加密,告诉服务器。第三步是告诉服务器我已经拥有你的证书和公钥了(可选)。
4.最后两方再一次交换密钥,这个交换过程是为了防止密钥被攻击者修改。
经历了SSL握手之后,客户和服务器就可以通过会话密钥加密通信。
同时在通信过程中,SSL中还有一个警报协议来保护出现问题的情况,一旦出现错误立刻发出警报,如果是致命错误,会立即关闭SSL连接并删除会话,密钥等信息。
那么问题就出现了。为什么这种安全的协议不在所有网站上使用起来呢。
因为https协议也有一些不好的地方,
1.首先它更耗时,毕竟多了握手的过程与加密的过程。
2.SSL证书需要钱,小网站一般不会用。
3.SSL证书需要绑定IP,不能再一个IP上绑定多个域名,IPV4资源不能支撑这个消耗
4.它的加密范围有限,只能在某些方面安全,有些国家控制CA证书,中间人攻击一样可行。
提到它更耗时,那么我们简单的来看一下它到底多么耗时。
在linux命令窗口输入:
-w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://www.alipay.com
上面命令中的w参数表示指定输出格式,time_connect变量表示TCP握手的耗时,time_appconnect变量表示SSL握手的耗时,s参数和o参数用来关闭标准输出。
我运行了多次,结果分别为:(单位是秒)
TCP handshake: 0.053, SSL handshake: 0.288
TCP handshake: 0.055, SSL handshake: 0.297
TCP handshake: 0.078, SSL handshake: 0.345
TCP handshake: 0.081, SSL handshake: 0.347
TCP handshake: 0.072, SSL handshake: 0.319
可以看到,在建立连接阶段,TCP+SSL握手的耗时就要远高于TCP握手,大约为4-5倍
因此在安全度不高的情况下,能不用SSL就别用了。