十分钟了解HTTPS

只要十分钟,十分钟你看了不吃亏,十分钟你看了不上当,十分钟就可以让你对HTTPS的话题对酒当歌侃侃而谈,来吧备上花生瓜子八宝粥让我们荡起双桨 走起~

阅读本文需要您对HTTP有基本了解,读完大概需要十分钟左右。

From https://LuckyMona.github.io

一、为什么要用HTTPS——HTTP协议的缺陷

  1. 通信使用明文(不加密),内容可能会被窃听

  2. 不能验证通信方的身份,所以请求和响应都有可能是攻击者发送的

    数据包在由A到B的过程中,可能经历很多次路由转发,这个过程中数据包可能会被劫持和替换,A和B都无法确定收到的信息是否就是对方发送的。

  3. 无法证明报文的完整性,可能是经过篡改的信息。

    同样是在A到B传输过程中,数据包被劫持、篡改之后继续传输,虽然接收方收到的数据包就是发送方发送的那个,但是内容已经遭到篡改,这样无法保证报文的完整性。

二、HTTPS是怎么克服这些缺陷的?

2.1 HTTPS是什么?

HTTPS:在HTTP通信时增加一层TLS通信,以前是HTTP直接和TCP通信,现在HTTP先与TLS通信,再由TLS和TCP进行通信。HTTPS拥有加密、证书校验身份、准确性校验这些功能,避免了HTTP的三个缺陷。

TLS的前身是SSL,TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。

HTTP建立通信时,只需要进行TCP三次握手就可以开始传输数据了,而HTTPS在建立通信时,先进行TCP三次握手,再进行TLS握手,然后开始发送数据。

2.2 HTTPS的加密功能

加密技术分为:

  1. 共享密钥加密,也叫对称密钥加密,只有一把密钥,通信方必须先将密钥发送给接收方,然后接收方使用密钥对密文解密,但是密钥发送的过程很难保证安全,一旦密钥被窃取,就不能保证加密的安全了。

  2. 公开密钥加密,即非对称密钥加密,有两把密钥,公钥public key 和私钥private key

    公钥是公开的,可以随意发布,任何人都可以获得。A使用B发布的公钥加密报文,B接收后使用自己的私钥进行解密,这样私钥不需要传输,也就不必担心被窃取的风险。

对称加密处理速度要比非对称加密要快,所以在保证安全的基础上,应多使用对称加密方式。TLS采用非对称加密的加密方式HTTPS采用混合加密机制:大部分通信使用对称密钥加密,但首次交换共享密钥时是使用非对称加密的方式,这样就既保证了安全,又速度最快。

2.3 HTTPS的身份认证功能

按照上文介绍的非对称加密方式,会有一个安全缺陷:客户端怎么知道拿到的公钥是否就是服务端发放的公钥呢,因为在拿到的过程中,公钥有可能被掉包。于是为了避免这个缺陷,引入了证书的概念。

公钥证书

为了保证公钥是目标服务器发行的公钥,需要使用权威第三方机构(以下称为CA机构)颁发的公钥证书

  • 服务器去CA机构申请证书,机构颁发加数字签名的公钥证书,数字签名可以使用CA机构的公钥来验证;
  • 服务器把公钥证书以公开密钥加密方式传给客户端;
  • 浏览器内会植入常用CA机构的公钥;
  • 客户端从浏览器拿到CA机构的公钥,并用它验证收到的公钥证书的数字签名,验证通过,证明服务器的公钥值得信任,客户端就从公钥证书取出公钥。

总结一下就是服务器传递的公钥上有CA的签名,客户端通过验证签名证实服务器的身份,并安全地得到公钥。

HTTPS首次交换共享密钥使用的是非对称加密方式,这种加密方式会使用公钥证书来验证服务端的身份。而想要验证客户端的身份就不是那么容易了,需要用户去申请证书,而且权威机构的证书是要花钱的,所以客户端身份验证充满挑战。现状是,仅有特殊用途的业务实现了客户端证书,比如那些可支撑客户端证书支出费用的业务,例如银行网银就采用了客户端证书。

2.4 HTTPS的完整性校验功能

在HTTPS的通信流程中,应用层发送数据时,会附加一种叫做MAC的报文摘要,MAC能够查知报文是否遭到篡改,从而保护报文的完整性。

三、HTTPS建立通信的过程简介

HTTPS首次建立通信时,假设C是客户端client,S是服务器端server,以SSL为例:

  1. C/S会先进行TCP三次握手;

  2. 然后C发送Client Hello报文及其他SSL信息,表示开始SSL通信过程;

  3. S收到后回以Server Hello及其他SSL信息,此外S还发送公钥证书,随后发送Server Hello Done通知Client SSL握手协商部分结束

    即SSL第一次握手结束,这个过程最重要的是S把公钥证书交给了C;

  4. C验证公钥证书有效性,然后取出公钥,然后:

    • 回以Client Key Exchange报文,报文中包含通过公钥加密过的Pre-master-secret是一个随机密码串。
    • C接着发送Change Cipher Spec报文,告诉S此报文后的通信会用Pre-master-secret进行加密。
    • C发送Finished报文,并包含上述全部报文的整体校验值。这次握手协商能否成功,要看S是否正确解密该报文。
  5. S收到加密过的pre-master secret,用自己的私钥得到pre-master secret,然后:

    • 发送Change Cipher Spec报文

    • S发送Finished报文。

  6. C/S使用pre-master secret经过一系列步骤生成master secret,使用master secret生成对称密钥session key,之后传输的收据均使用session key加密解密。

至此,SSL连接建立完成,这个过程最重要的是C把Pre-master-secret用上一步传递的公钥加密后传给S。之后开始进行HTTP通信,并用共享密钥对通信进行对称加密。

四、HTTPS的问题

当使用SSL时,它的处理速度变慢:

  1. 通信速度变慢,因为除了HTTP请求和响应,还要进行SSL通信,通信量会增加
  2. 因为C/S端都要加密解密,更耗计算资源,SSL加速器可以改善S端问题

建议的是如果非敏感信息使用HTTP通信,只有在包含个人信息等敏感数据时,才利用HTTPS进行通信。特别是访问量较多的网站在加密处理时,会承担较大的负载,可以仅在需要信息隐藏时才加密,以节约资源。但是查看淘宝、京东都是所有请求都采用的HTTPS,也有搜索到一些讲部分页面采用HTTP,部分页面采用HTTPS的部署方法的博文,因为现在我对部署这一块的东西还比较生疏,所以后续有时间再关注。

默认端口

  1. HTTP默认端口80
  2. HTTPS默认端口443

参考

  1. 深入理解HTTPS协议
  2. 《图解HTTP》
  3. HTTPS工作原理
  4. SSL的保密性、真实性、完整性和不可否认性
  5. Nginx部署部分https与部分http