HTTPS加密过程解析

1,197 阅读7分钟

作者:喜欢吃辣的程序员
原文链接: HTTPS加密过程解析

HTTPS出现之前,通过HTTP协议进行的数据交互都是通过明文的方式进行传输,网络数据在传输过程中,满足一定的条件时,例如通过网关,路由器、wifi热点等节点时,数据包可能会被中间人给劫持,数据安全性受到了极大的威胁。为了解决这样的问题,HTTPS出现了,HTTPS协议是通过加入SSL/TLS来加密HTTP数据进行安全传输的HTTP协议,同时默认启用443端口进行数据传输, 那HTTPS是如何保障数据传输过程中的安全的呢?那就得从数据的加密方式说起了。

对称加密和非对称加密

数据的加密过程是对原有的明文的数据按照某种算法进行数据转换,使其成为一段不可读的密文,通过相应的密钥进行解密之后才能显示出原内容,加密算法分为对称加密和非对称加密。

  • 对称加密:是最简单的一种加密方式,加密和解密都使用同一串密钥,加密效率很高,加密强度随着密钥大小递增,即密钥越小越容易破解,反之则越难破解,加密和解密速度也是与密钥大小成正比,对称使用相对较小的密钥,一般小于256bit,既要保证一定程度的安全性,又要兼顾到效率。

  • 非对称加密:加密速度较慢,加密和解密需要两个不同的密钥,必须是同一个密钥对,密钥对含一个公钥和一个与之对应的私钥。公钥是密钥对中公 开的部分,私钥则是非公开的部分,公钥通常用于会话加密,验证数字签名或者加密可以用相应私钥解密的数据。

HTTPS的工作方式

HTTPS在进行数据传输之前,需要客户端与服务器之间进行一次握手,在握手过程中将确认双方加密传输数据的密码信息。该过程中采用TLS/SSL协议,TLS/SSL协议是一种加密通道的规范,SSL由从前的网景公司开发,TLS是SSL的标准化后的产物,TLS/SSL采用了非对称加密,对称加密以及HASH算法。握手过程大致如下:

  1. 客户端向服务端发起连接请求,并告知服务器将建立HTTPS连接,此时客户端同时将自己支持的加密算法带给服务端。 

  2. 服务端收到这套加密算法的时候,和自己支持的加密算法进行对比(也就是和自己的私钥进行对比),如果不符合,就断开连接,如果符合, 选出一组加密算法与HASH算法,服务器将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,签名的HASh算法以及证书的颁发机构等信息。  

  3. 客户端获得网站证书之后: 

  • 首先,使用根证书验证颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等等,如果证书受信任,浏览器地址栏左侧会显示一个锁的图标,否则会给出证书不受信的提示。 
  • 其次,如果证书受信任,也可能不受信任的证书(可能是自制的证书或是非权威机构颁发的整数),浏览器会生成一串随机数的密码(RSA签名),并用证书中提供的公钥加密。 
  • 最后,使用约定好的HASH算法计算握手消息,并使用生成的密码对消息进行加密,目的是为了保证传回到服务端的握手信息没有被篡改,并一起将之前生成的所有信息发送给服务端。 
  1. 服务端接收到客户端发来的数据之后,首先,使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与客户端来的一致。 如果一致,使用随机字符串加密握手信息和握手信息HASH值发回给到客户端。

  2. 客户端收到消息之后,解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。 

以上过程是客户端和服务端进行第一次请求时的连接验证过程,连接验证成功之后,即连接是安全的。

为什么不使用更简单的加密方式

HTTPS进行数据内容传输时使用的是对称加密,在证书的验证阶段用的是非对称加密,为什么会通过这样的方式呢?既然对称加密的效率较高,为什么不直接使用对称加密呢?

先来假设一下服务器和客户端通信使用对称加密的情况,双方建立通信的时候,服务器生成一个密钥,如何安全的把密钥传输到客户端才是最难的问题,在传输过程中可能会被中间人劫持获得了密钥,那么后续服务器和客户端进行通信的内容同样会被中间人给解析,安全问题一直存在。当然,如果客户端预存了一份网站的密钥,密钥不在网络中进行传输,这样内容进行传输在理论上来说显然是安全的,但是明显不现实。

同样的,无论服务器和客户端采用非对称加密或是非对称加密+非对称加密等方案(这样会很耗时),公钥A向客户端传输的过程中,因为都是明文传输的,都会有很大的风险被中间人给劫持到,这就是属于中间人攻击,中间人对公钥进行篡改,例如,中间人通过用自己的公钥B传输给客户端,客户端无法判断公钥B是不是来自于服务器,客户端用的公钥传输给客户端,仍然会出现数据的安全问题。所以,在使用加密传输的过程中,如何保证客户端收到的一定是服务器传来的密钥,是非常关键的一环。

SSL证书

HTTPS建立连接的核心过程是握手过程,握手过程中确定了数据加密的密码,而这个核心过程过程中服务端向客户端发送了SSL证书,SSL证书用于HTTP协议加密,就是一个HTTPS网站的身份证明,这保障了客户端接收到的公钥及其他信息是来自于服务器,服务器可以安全的将加密算法、HASH算法和自己的身份信息等以证书的形式发到浏览器,除此之外,证书里面包含了服务器地址,加密公钥,证书的有效期限和证书的颁发机构等信息。SSL证书可以向CA机构付费购买,也可以自己制作。

SSL证书的验证

上面提到SSL证书可以向CA机构付费购买也可以自己制作,自己制作的证书不会受到浏览器的信任,在访问的时候由于证书验证失败而给出警告。例如,在访问一些陌生网站的时候,是不是遇到过网站访问不了,需要需安装非权威根证书的情况?客户端认为这个网站颁发证书的机构是不可信的,那么你就得手动下载安装该机构的根证书,并且可能会存在一定的风险。信任和不可信任是如何判断的呢?

计算机的操作系统、浏览器本身会预装一些它们信任的根证书,如果其中会有CA机构的根证书,通过根证书去判断服务器传回的证书就能判断当前证书是不是受信任的了。

证书之间的认证还可以通过证书链的形式组织,可以A信任B,B信任C,以此类推,即信任链。也就是一连串的数字证书,由根证书为起点,透过层层信任,使终端实体证书的持有者可以获得转授的信任,以证明身份。

以上就是一个HTTPS加密大致的过程,很多地方没有进行深入的覆盖,如有遗漏,欢迎指正。