HTTPS工作原理

2,645 阅读8分钟

前言

我们知道使用HTTP协议进行服务端与客户端通信时,信息是通过明文传输的。这期间信息就有可能被拦截或者篡改,为了解决这种场景,HTTPS就出现了。

相对于HTTP来说,HTTPS有如下作用。

  • 内容加密,无法被轻易破解;
  • 身份认证,如果信息被篡改,通信双方可以立刻发现;
  • 数据完整性校验;

接下来就学一下HTTPS的工作原理。

HTTPS的组成

HTTPS是目前使用最多的HTTP安全形式。在使用HTTPS时,所有的HTTP请求和响应数据在发送到网络之前,都会进行加密。

上图展示了HTTP与HTTPS在网络协议中的表现,可以看到在应用层中HTTPS=HTTP + SSL/TLS

什么是SSL/TSL

SSL和TSL是一种安全协议。其中SSL是早起采用的安全协议,后来TSL是在SSL的基础上进一步标准化了SSL协议。在上面的图中可以看到,SSL和TSL位于传输层之上,在数据到达传输层之前都会经过SSL/TSL协议层处理,由SSL/TSL保证数据的机密性和完整性。

SSL/TSL中的加密技术

SSL/TSL安全协议保证数据安全的技术基础就是密码学。接下来,我们先了解一些跟HTTPS有关的密码学知识。

密码和密钥

密码是一种编码方案的算法,也就是使用一种编码方式编码数据,然后使用相应的解码方式解码数据的算法。

密钥是编码的参数。

通过密码+密钥就可以实现加密数据。

对称密钥加密

对称加密就是编码和解码使用同一个密钥的加密技术。

在对称加密中,发送端和接收端使用相同的密钥进行通信。发送端使用共享的密钥发送报文,然后将密文发送到接收端。接收端使用相同密钥解密密文,恢复原始数据。

非对称密钥加密

非对称加密也成为公开密钥加密技术,就是使用不同密钥进行通信的加密技术。

非对称加密技术使用了不同的密钥进行通信,在发送端使用公钥对报文进行加密(公钥就是所用人都可以获取到的密钥),然后在接收端使用私钥对加密的密文进行解密。常见的非对称加密技术是RSA技术。

数字签名

数字签名是附加在报文上的特殊加密校验码。数字签名可以防止报文被篡改,如果有恶意攻击在传输过程在篡改了报文,那么校验的时候校验和就不再匹配,因此可以确认报文被篡改了。

数字签名的加解密过程:

  • 发送端将报文通过算法(比如通过HASH函数)提取为定长的摘要;
  • 发送端将摘要应用签名算法,以私有密钥作为参数生成一个签名;
  • 计算得出签名后,将签名附加在报文末端发送给接收方;
  • 接收端收到报文后,对签名进行检查。接收端通过公开密钥解码签名。然后比对报文生成的摘要是否与签名一致便可判断报文是否被篡改。

数字证书

数字证书是由权威机构给某网站颁发的一种认可凭证。它主要包含一些认证信息,比如:对象的名称(服务器、组织、个人等)、过期时间、证书颁发者、来自证书发布者的数字签名。

上面的图片就是www.google.com的证书。

我们可以看到在上面讲到数字签名的时候,似乎就可以保证报文的安全了。为什么还需要数字证书呢?这个设想一下这个场景:比如某人A把发送到浏览器的公有密钥进行了替换,同时A在给浏览器发送报文时使用自己的私有密钥对报文进行数字签名,那么浏览器就不能确认报文是否来自于真实服务器。这个时候就可以使用数字证书进行验证,因为数字证书中保存了真实服务器的信息。

HTTPS的工作流程

建立安全传输

在TCP连接建立完成以后,在HTTPS协议中,客户端和服务端会初始化SSL层,也就是安全层。

SSL握手

在发送报文之前,客户端和服务端会进行一次SSL握手,在这个过程中主要完成以下工作:

  • 交换协议版本号;
  • 选择一个两端都了解的密码;
  • 对两端的身份进行认证;
  • 生成临时会话密钥,以便加密信道(建立完安全通道后,传输报文时使用对称加密);

在SSL会进行很多工作,处理交换一些必要的信息之外,还会对身份进行认证。

这里的认证是通过数字证书进行的,在客户端获取证书后,会采用相应的算法对服务端的身份信息进行验证:

  • 日期检测:客户端会检查证书的有效期是否合法;
  • 签名颁布者可信度检测:浏览器会附带一个签名颁发机构的授信列表,如果浏览器收到了位置的颁发机构签发的证书,那么它会显示一条警告信息;
  • 签名检测:客户端对签名使用签名颁发机构的公开密钥,然后将其与校验码比较,以便验证证书是否合法;
  • 站点身份检测:客户端验证数字证书中的域名是否与服务端的域名匹配;

身份认证完成后,客户端与服务端进行密码协商,确定本次连接采用哪种加密算法进行通信。

开始通信

SSL握手完成后,就完成建立了HTTPS通道,客户端与服务端就会根据协商的加密算法进行通信。

整个HTTPS的工作流程可以总结如下:

HTTPS如何保证安全

在分析这个问题之前,先介绍一下中间人攻击。

中间人攻击

中间人攻击简单来讲就是在通信双方存在一个中间人通过拦截通信过程,篡改或者窃听通信信息,同时通信双方没有感知信息被篡改的一个过程。

一个简单的中间人攻击过程就是:

  1. 客户端请求服务单的公钥;
  2. 中间人劫持服务端下发的公钥,保存在自己手中;
  3. 中间人生成一对密钥对,把伪造的公钥下发给客户端;
  4. 客户端使用伪造的公钥与中间人通信;
  5. 中间人通过解密客户端的信息,然后使用正确的公钥再次加密与服务端通信;

HTTPS的解决方案

HTTPS在加密的基础上又新增了数字证书。在上面也讲到了数字证书的构成与作用。此外,数字签名的原理也有 应用。

数字证书的校验:

  1. 客户端与服务端建立通信,服务端下发数字证书;
  2. 客户端首先校验证书的有效性,比如有效期、域名是否有效等。如果无效,则终止链接(比如浏览器会提示不信任的链接)。
  3. 如果有效,客户端从证书中获取公钥,使用签名算法对数字签名进行解密得到证书的摘要和摘要算法;
  4. 客户端通过解密得到的摘要算法对证书进行摘要计算,然后与数字签名中的摘要进行对比。如果一致说明证书有效;否则,证书无效;

通过以上过程客户端就可以跟服务端建立起加密通道。

加入证书校验后中间人就无法伪造信息:

  • 如果中间人使用假数字证书,那么在数字签名解密时就会失败,因为解密使用的私钥不一致会导致失败;
  • 中间人篡改证书中的公钥。即使公钥被篡改,但数字签名时私钥计算的,在校验证书摘要时就会出现摘要不一致的结果;
  • 中间人也可以获取正常的公钥,但客户端与服务端通信是会随机生成密钥,中间人无法获取真实的密钥。

总结

相较于HTTP协议,HTTPS确保了报文的机密性以及完整性。HTTPS确保这些的依赖就是SSL/TSL协议,SSL/TSL安全协议搭配数字证书保证了报文在传输过程中的绝对安全。