HTTPS——让数据传输更安全

110 阅读12分钟

HTTPS是为了让数据在传输的时候更加安全

HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL 证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。

HTTPS 是一种通过计算机网络进行安全通信的传输协议,经由 HTTP 进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS 使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。

一、在HTTP协议栈中引入安全层

HTTP数据提交给TCP层之后,用户会经过用户电脑、WiFi路由器、运营商和目标服务器,在这中间的每个环节中,数据都有可能被窃取或篡改。比如用户电脑被黑客安装了恶意软件,那么恶意软件就能抓取和篡改所发出的HTTP请求的内容。或者用户一不小心连接上了WiFi钓鱼路由器,那么数据也有可能被黑客抓取或篡改

从HTTP协议栈层面来看,我们可以在TCP和HTTP之间插入一个安全层,所有经过安全层的数据都会被加密或者解密。

HTTPS中,HTTP先和安全层进行通信,然后安全层再和TCP层通信。也就是说HTTPS所有的安全核心都在安全层。安全层既不影响上层也不会影响下层。搞清楚HTTPS,就是要搞清楚安全层。

安全层有两个职责

  • 对发起HTTP请求的数据进行加密操作
  • 对接收到HTTP的内容进行解密操作

二、HTTPS版本演进过程

总的来说HTTPS版本有四个:对称加密、非对称加密、对称加密非对称加密混合使用、在混合方式的基础上添加数字证书

屏蔽掉HTTP的其他东西,下面只讨论安全层做了什么。

1、对称加密

第一版的HTTPS使用的是对称加密

对称加密就是指加密和解密都是用的同一把密钥

① 使用对称加密建立安全连接

使用对称加密时建立安全连接的过程(指的是服务器和浏览器之间协商加密方式和密钥.)

  • 浏览器发送它所支持的加密套件列表和一个随机数 client-random,这里的加密套件是指加密的方法,加密套件列表就是指浏览器能支持多少种加密方法列表。
  • 服务器会从加密套件列表中选取一个加密套件,然后还会生成一个随机数 service-random,并将 service-random 和加密套件返回给浏览器。
  • 最后浏览器和服务器分别返回确认消息。

这样浏览器端和服务器端都有相同的 client-random 和 service-random 了.收发双方会利用这两个random生成密钥.安全连接建立完成,可以利用密钥传输数据了.

② 优缺点

使用对称加密的安全连接有一个优点和一个缺点

  • 拥有密钥的双方都可以发送加密的数据,对方都可以正确解密.
  • 但是client-random和service-random是明文传输的,黑客可以获取到并利用它们来合成密钥,这样黑客也可以解密数据.

2、非对称加密

第二版的HTTPS使用的是非对称加密

非对称加密就是有A、B两把密钥。如果你用A来加密,就只能利用B来解密;如果你用B来加密,就只能利用A来解密。

① 使用非对称加密建立安全连接

使用非对称加密时建立安全连接的过程

  • 浏览器发送加密套件列表给服务器
  • 服务器选择一个加密套件,服务器返回这个加密套件和公钥给浏览器
  • 浏览器和服务器返回确认消息

② 优缺点

使用非对称加密建立的安全连接有一个优点和两个缺点

  • 浏览器端发送数据时可以使用公钥加密,只有拥有私钥的服务端可以解密.实现了浏览器端到服务器端发送数据时的安全.
  • 服务器向浏览器发送的数据不能加密.
  • 非对称加密的加解密效率低,影响用户打开页面的速度.

3、对称加密和非对称加密搭配使用

第三版的HTTPS使用的是非对称加密搭配使用

在传输阶段使用对称加密,对称加密的密钥采用非对称加密来传输

① 使用对称加密和非对称加密搭配建立安全连接

使用对称加密和非对称加密搭配建立安全连接的过程

  • 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
  • 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和公钥;
  • 浏览器保存公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
  • 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。

就是说浏览器先得到非对称加密中的私钥,加密随机数pre-master发送给服务端,这样双方都有pre-master.然后双方都使用client-random,service-random和pre-master生成密钥.黑客获取不到pre-master而得不到密钥.

4、现在的HTTPS

黑客可以通过DNS劫持将IP地址替换成了黑客的IP地址,这样就访问的是黑客的服务器了。解决的办法就是向服务端添加数字证书(在对称加密和非对称加密搭配使用的基础上).

CA(Certificate Authority):数字证书认证机构

Digital Certificate:数字证书

服务端的数字证书有两个作用:第一向浏览器证明自己的身份;第二数字证书包含服务器公钥.

① 现在的HTTPS如何建立安全连接

假设服务端已经向CA申请到了数字证书,看现在的HTTPS是如何建立安全连接的.

  • 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥是包含在数字证书中的;
  • 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后续流程。

  • 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
  • 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和数字证书(包含公钥);
  • 浏览器验证证书,保存证书中的公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
  • 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。

② 服务器如何申请数字证书

理解申请数字证书的过程,才能理解浏览器如何验证数字证书

申请两个数字证书
  • 服务器填写一张表单,包含自己公钥、站点资料、公司资料等信息,提交给CA机构.
  • CA机构审核通过
  • 然后CA机构会生成两个数字证书.第一个是服务器的数字证书,包含了服务器发来的公钥、服务器方的基础信息和CA数字签名;第二个是CA的数字证书包含了自己的公钥(用来解密数字签名)、CA的基础信息、数字签名。这两个证书会一并发回给服务器。
服务器数字证书申请过程
  • 首先CA机构根据服务器发来的表单数据的重要信息进行哈希计算,生成信息摘要,然后服务器根据消息摘要使用私钥加密信息摘要,生成数字签名(这个数字签名由CA数字证书中的公钥解密)。然后生成的数字证书的内容包括三部分:服务器的信息、服务器的公钥、数字签名。

③ 浏览器如何验证服务器数字证书合法性

浏览器拿到数字证书后要做三件事情:证书的有效期、证书是否被 CA 吊销、证书是否是对应的 CA 机构颁发的。主要是第三步.

验证服务器证书是否是合法的CA机构颁发

  • 首先利用证书的原始信息进行哈希计算,得到信息摘要A.
  • 然后利用CA的公钥解密数字签名,又得到一个信息摘要B.
  • 最后判断A、B是是否相等,相等则证明合法服务器数字证书合法。

④ 验证CA机构的合法性

验证了服务器数字证书的合法性,但不能验证CA机构和它颁发的证书的合法性。

数字证书链

  • 一般颁发给服务器证书的CA浏览器不会直接信任,被称为中间CA.
  • 操作系统会内置一些信任的CA机构的数字证书,称为根CA。根证书是通过WebTrust认证的.所以是值得信任的.
  • 验证中间CA的合法性,会找上一级中间CA,直到追溯到浏览器内置的那一个根CA.
  • 只有数字证书链上所有的CA都受信任才会完成数字证书认证.

三、总结

1、HTTP和HTTPS的区别

  • HTTP 的 URL 以http://开头,而 HTTPS 的 URL 以https://开头。
  • HTTP 标准端口是 80,而 HTTPS 的标准端口是 443。
  • HTTPS 需要到 CA 申请证书,一般免费证书较少,因而需要一定费用
  • HTTP 建立连接的耗时=TCP 握手,而 HTTPS 耗时=TCP 握手+SSL 握手。
  • HTTPS 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
  • HTTP 是明文传输的,而 HTTPS 是加密传输的。

2、HTTPS加密算法

① 对称加密

服务器和客户端共用同一把密钥来加密解密.

  • 浏览器发送它所支持的加密套件列表和一个随机数 client-random,这里的加密套件是指加密的方法,加密套件列表就是指浏览器能支持多少种加密方法列表。
  • 服务器会从加密套件列表中选取一个加密套件,然后还会生成一个随机数 service-random,并将 service-random 和加密套件返回给浏览器。
  • 最后浏览器和服务器分别返回确认消息。

② 非对称加密

服务器拥有私钥,把公钥发给客户端,只能实现客户端到服务端单方向的加密.

  • 浏览器发送加密套件列表给服务器
  • 服务器选择一个加密套件,服务器返回这个加密套件和公钥给浏览器
  • 浏览器和服务器返回确认消息

③ 对称加密和非对称加密混合使用

对称加密和非对称加密混合使用的办法可以实现双方向的加密,但是解决不了DNS劫持问题.

  • 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
  • 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和公钥;
  • 浏览器保存公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
  • 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。

④ 加入CA证书

服务端需要向CA申请数字证书,客户端验证了这个数字证书之后才会走与服务端建立连接的过程.

  • 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥是包含在数字证书中的;
  • 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后续流程。

  • 首先浏览器向服务器发送对称加密套件列表、随机数 client-random和非对称加密套件列表
  • 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和数字证书(包含公钥);
  • 浏览器验证证书,保存证书中的公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
  • 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。

再就是验证数字证书的过程

  • 首先利用证书的原始信息进行哈希计算,得到信息摘要A.
  • 然后利用CA的公钥解密数字签名,又得到一个信息摘要B.
  • 最后判断A、B是是否相等,相等则证明合法服务器数字证书合法.

证书合法之后还要判断颁发这个证书的CA是否合法,这就涉及到了数字证书链

  • 一般颁发给服务器证书的CA浏览器不会直接信任,被称为中间CA.
  • 操作系统会内置一些信任的CA机构的数字证书,称为根CA。根证书是通过WebTrust认证的.所以是值得信任的.
  • 验证中间CA的合法性,会找上一级中间CA,直到追溯到浏览器内置的那一个根CA.
  • 只有数字证书链上所有的CA都受信任才会完成最终的数字证书认证.