全文共1539字,预计耗时8分钟

HTTPS

其实它并不是一个新的协议,而是在 HTTP 下面增加了一层 SSL/TLS 协议,简单的讲,HTTPS = HTTP + SSL/TLS,即HTTP下加入SSL层。

什么是 SSL/TLS

SSL 即安全套接层(Secure Sockets Layer),在 OSI 七层模型中处于会话层(第 5 层)。之前 SSL 出过三个大版本,当它发展到第三个大版本的时候才被标准化,成为 TLS(传输层安全,Transport Layer Security),并被当做 TLS1.0 的版本,准确地说,TLS1.0 = SSL3.1。
现在主流的版本是 TLS/1.2, 之前的 TLS1.0、TLS1.1 都被认为是不安全的,在不久的将来会被完全淘汰。

工作原理

  • 客户端发送请求到服务端
  • 服务端将自身的相关信息和公钥给到CA
  • 通过hash算法处理这个相关信息和公钥得到一份消息摘要
  • CA用自己的私钥将它加密成数字签名,和服务端提供的原始的公钥以及自身相关信息一起作为数字证书给到服务端
  • 服务端将这个数字证书给到客户端
  • 客户端通过CA公钥将数字签证解密得到公钥和服务端的相关信息,并和数字证书中携带的原始信息进行比对
  • 比对无误后客户端将给数据对称加密的密钥通过刚得到的服务端公钥进行非对称加密,并给到服务端
  • 服务端收到并用自己的私钥解密,至此,双方都有了数据对称加密的密钥,并可以以此传输数据

与HTTP不同之处

  • 端口: 443
  • 需要申请证书,证书大多收费
  • 非对称加密更慢,故而还是对数据进行对称加密,只对对称加密的密钥进行非对称加密

SSL/TLS协议运行机制

如何保证公钥不被篡改

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。

公钥加密计算量太大,如何减少耗用时间

解决方法:使用对称秘钥加密信息,使用非对称秘钥加密对称秘钥本身

基本过程

  1. 客户端向服务器端索要并验证公钥。
  2. 双方协商生成对话密钥
  3. 双方采用对话密钥进行加密通信。

上方前2步也称为握手阶段,握手阶段详细过程如下

1.客户端发出请求(ClientHello)

首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
在这一步,客户端主要向服务器提供以下信息。

  • 支持的协议版本,比如TLS 1.0版。
  • 一个客户端生成的随机数,稍后用于生成"对话密钥"。
  • 支持的加密方法,比如RSA公钥加密。
  • 支持的压缩方法。
  • 服务器的域名(06年加的扩展,否则一个服务器只能有一个数字证书,对于虚拟机来说,很不方便)

2.服务器回应(SeverHello)

服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。

  • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
  • 一个服务器生成的随机数,稍后用于生成"对话密钥"。
  • 确认使用的加密方法,比如RSA公钥加密。
  • 服务器证书。

除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

3.客户端回应

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。

  • 一个随机数。该随机数用服务器公钥加密,防止被窃听。
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。

4.服务器的最后回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

Loading...