HTTPS

概述

HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TSL协议代替而已。通常,HTTP直接和TCP通信。当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。简言之,所谓HTTPS,其实就是身披SSL协议这层外壳的HTTP。

HTTP缺点

  • 通信使用明文(不加密),内容可能会被窃听。
  • 不验证通信方的身份,因此有可能遭遇伪装。
  • 无法证明报文的完整性,所以有可能已遭篡改。

HTTPS中的加密方式

共享密钥加密: 加密和解密同用一个密钥的方式称为共享加密,也被叫做对称密钥加密对称加密

公开密钥加密: 使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。私有密钥不能让其他任何人知道, 而公开密钥则可以随意发布,任何人都可获得。又称为非对称密钥加密非对称加密

在交换密钥环节使用 公开密钥加密 方式、之后的建立通信交换报文阶段则使用 共享密钥加密 方式。

所以

在交换密钥环节使用 对称加密方式,之后建立通信交换报文阶段则使用非对称密码方式。

  1. 使用公开密钥加密方式安全地交换在稍后共享密钥加密中要使用的密钥。
  2. 确保交换的密钥是安全的前提下,使用共享密钥加密方式进行通信。

SSL链接建立流程

SSL

  1. 客户端先向服务器发出加密通信请求,这被叫做ClientHello请求。该请求携带如下信息。

    1
    2
    3
    4
    1. 支持的协议版本,比如TLS1.0版。
    2. 一个客户端生成的随机数,稍后用户生成“对话密钥”。
    3. 支持的加密方法,比如RSA公钥加密。
    4. 支持的压缩方法。
  2. 服务器收到客户端请求后,向客户端发出回应。这个叫做SeverHello,服务器的回应包含以下内容。

    1
    2
    3
    4
    1. 确认使用的加密通信协议版本。
    2. 一个服务器生成的随机数。
    3. 确认使用的加密方法。
    4. 服务器证书。

    注意: 如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供“客户端证书”。

  3. 客户端收的到服务器的回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

    如果证书没有问题,客户端就会从证书中取出公钥,然后向服务器发生下面三项信息:

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

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

    为什么要用三个随机数:

    1
    2
    3
    4
    5
    "不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
    对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
    pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"

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

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

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

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

证书验证流程

我SSL连接过程中,第二步客户端从服务端接收到证书,如何验证证书的有效性呢? 这里需要引出一个第三方机构,数字证书认证机构,这个机构是值得信赖的。证书验证流程如下:

证书校验

客户端一般会内置数字认证机构的公开密钥。

参考

SSL/TLS协议运行机制的概述

图解HTTP