引入:HTTP 存在的问题
HTTP
协议在诞生之初,设计时并没有考虑安全上的问题。但随着互联网的发展,逐渐出现了企图利用web
安全中的漏洞牟利的人,这时候便暴露出了HTTP
协议所存在的两个主要问题:
HTTP
的报文是以明文形式传输的。如果在我们向服务端发请求时,有人在进行网络嗅探与监听,便可以轻松地得知请求中的数据,从而带来数据泄漏的危险。HTTP
的身份认证缺乏校验 ,其中最典型的问题便是中间人攻击 。假设在客户端和服务端的沟通过程中存在攻击者,攻击者与通讯两端分别建立联系,并且可以篡改请求和响应的内容 。这种情况下,客户端和服务端都认为是在与对方进行直接的通信,但实际上通信过程却被攻击者完全控制了。之所以出现这种情况正是因为通信各端缺乏有效的认证。
为了解决HTTP
协议存在的这两个问题,Netscape
公司于1994
年创建了HTTPS
。相比于HTTP
,HTTPS
大大增强了请求-响应的安全性,它的主要工作流程如下:
- 在正式传输数据之前,首先进行身份验证,这保证了不会出现中间人攻击。
- 认证成功后,协商之后通信的加密密钥,从而可以对报文进行加密
- 后续的传输数据使用秘钥进行加密
一、例子:访问淘宝
接下来,我们结合这张图,通过一个例子对HTTPS
的工作流程进行更加具体的介绍:

- 假设我们现在正在访问淘宝,为了之后交易等过程的安全,我们会向客户端发起
HTTPS
请求。 - 现在淘宝收到了这个请求,为了确保在建立
HTTPS
请求的过程中,客户端收到的请求是来自自己而不是中间人,需要一个能够证明自己身份的唯一凭证,让客户端去验证,这个凭证也就是证书 。除此之外,淘宝还会有一对公钥和私钥,用来在协商密钥的过程中进行非对称加密。其中私钥只有自己知道,但是公钥可以让所有人知道。 - 接下来淘宝会把公钥放到证书中发给客户端。
- 客户端拿到了**(证书,公钥)**之后,首先会对证书进行验证,验证的过程我们会放在第二部分进行讲解。这里只需要知道,如果验证成功,则说明请求没有被中间人所篡改。
- 验证成功后,客户端会生成一个随机字符串
s
,作为之后对称加密 的密钥。客户端将s
使用公钥加密后发给服务端,由于公钥加密的内容只有私钥能够解密,而私钥又只有淘宝有,因此只有淘宝能够解密从而得到s
。 - 至此,密钥
s
的内容只有客户端和淘宝知道,因此之后的通信过程中只需要使用s
对明文内容进行对称加密,即可实现报文的加密。
如果是为了应付前端岗位的HTTPS
内容面试,说到这里就已经算是回答个大概了,但是如果想要能够回答面试官的追问,就需要对其中的一些内容有更深入的了解。接下来,我们分别对HTTPS
中的身份认证 和协商密钥做更加深入的介绍。
二、身份认证
我们刚才说到过,HTTPS
的身份认证是通过证书实现的,服务端把证书和公钥发给客户端后,客户端会对证书进行验证。
那么,什么是证书?客户端又是如何对证书进行验证的呢?
所谓证书,就是由证书管理机构(CA
)向颁发对象(例如淘宝网)颁发的身份凭证。通过将颁发对象的身份信息进行签名 后,和颁发对象的信息一起构成证书。
举个例子来说,假如淘宝网想要使用证书,就需要向CA
购买证书。CA
会根据以下表格中的数据,对数据进行签名(即对数据进行哈希运算后使用私钥加密),从而得到证书。

例如淘宝网的证书就是长这样的,我们可以看到证书是由GlobalSign
颁发的:

而GlobalSign
根证书则是存储在系统中的,因此浏览器会信任该根证书以及该根证书所颁发的证书,从而信任淘宝网的证书。

现在我们已经知道了证书其实就是颁发对象的信息及其签名。那么,客户端是如何验证证书的呢?
前面说过,签名是哈希运算 + 私钥加密。那么如果证书没有被篡改,则先对签名使用公钥进行解密,再将颁发对象的信息进行哈希运算,两者的结果应该是相等的。如果两者不相等,则一定说明有中间人对证书中的内容进行了篡改。
三、协商密钥
说完了身份验证,我们再来看一下协商密钥的内容。总的来说,这部分可以分为两步:
- 使用非对称加密,确保客户端生成的用于通信的对称密钥,不被攻击者监听获取
- 使用对称密钥进行通信
其中1
我们在淘宝的例子中已经进行了解释:客户端生成的对称密钥会使用公钥进行加密,而想要解密就只能使用私钥,而私钥只有服务端有,因此只有服务端可以获知对称密钥。因此之后使用对称密钥进行HTTPS
通信可以保证加密的内容不会被监听者破解。
那么,为什么要使用非对称加密 + 对称加密的手段呢?我们不妨来看看其他手段存在哪些问题。
首先,只使用对称加密是肯定不可行的。因为服务端没有办法只让客户端知道对称密钥,而不会被监听者获知。
如果只使用非对称加密呢?这种方式是可以实现我们的目的的,只需要浏览器也生成一对公私钥,把公钥公布出去。这样服务端和客户端之间的通信都使用公钥加密,则解密只能使用私钥,而私钥分别掌握在服务端和客户端上,因此保证了通信的安全性。但是这样的问题在于,非对称加密的耗时较大 ,相比于对称加密会耗费更多的时间。为了性能考量,HTTPS
选择了使用非对称加密+对称加密。
回到第2
步,我们现在已经可以使用对称密钥进行通信了,那么HTTPS
怎么确保密文没有被中间人篡改呢?这里同样用到了哈希函数(因为哈希函数有个很好的性质,只要输入改变了一点,输出相比原来就会大相径庭)。
我们举个例子,例如现在服务端要给客户端发送响应,服务端会对加密后的报文使用哈希函数进行处理(即生成报文的摘要),并把报文和摘要同时发给客户端。当客户端收到响应后,首先要生成报文的摘要,并和响应中的摘要进行对比。如果报文没有被篡改,则摘要应该是相同的;但是但凡报文被篡改了哪怕一个字符,生成的新的摘要相比原来都会完全不一样。因此我们可以通过这种方法来确保通信的内容不被篡改。
四、总结
HTTPS
协议通过非对称加密传递对称密钥,通信过程使用对称加密,从而对明文内容进行加密,确保监听者无法获取报文内容HTTPS
通过证书来进行身份校验HTTPS
通过对报文内容生成摘要确保报文内容不被篡改,避免中间人攻击