简单描述

http(s)协议栈

如图所示,http是一种在TCP之上传输的应用层协议,传输的数据是明文且容易被篡改,如果要保护数据的话需要自己动手;
https可以理解成“HTTP over SSL/TLS”,即在TCP与http之间加了一层SSL/TLS, 这层协议会与服务端协商并对流经的http包进行加密,从而达到保护数据的目的。
SSL全称Secure Sockets Layer,TLS是这层协议的一种实现。SSL的原理可以简单理解成:

  1. 服务端与客户端协商一种双方都支持的对称加密算法,并通过非对称加密安全地将密钥传递给双方。
  2. 双方使用协商的对称加密算法与密钥交互加密的数据。

基于TCP的http协议,所有数据(请求头、请求体)都是明文
基于SSL的https协议,所有数据(请求头、请求体)都被加密

建立安全连接的过程

安全协议连接的大致过程如下图
SSL连接过程

下面我们以访问https://www.baidu.com的数据包进行讲解。
首先使用tcpdump -i en0 -w ~/Desktop/baidu.pcap host www.baidu.com监听en0网卡,之后使用curl https://www.baidu.com发起请求,请求结束后关闭tcpdump,使用wireshark加载baidu.pcap,如下图
抓取的https流量

建立TCP连接

1.简单描述中得知,TLS也是基于TCP协议,所以它也需要通过TCP建立连接,并在交互之后断开连接,所以图中的前三个包就是TCP建立连接的三次握手,最后四个就是断开连接的4次挥手。经过三次握手后,TCP连接建立,开始SSL层的数据传输。

建立SSL连接

SSL握手过程

  1. Client Hello
    主要向服务端传递以下信息

    • 支持的协议版本,比如TLS 1.2。
    • 客户端生成的随机数,稍后用于生成”对话密钥”。
    • 支持的加密方法套装,比如Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)
    • 支持的压缩方法。
    • 通信的服务端域名。这主要用于在一台服务器上部署了多个网站时,告知服务器要与之通信的网站。
      Client Hello
  2. Server Hello
    服务端收到Client Hello后向客户端返回以下信息:

    • 确认使用的加密通信协议。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    • 服务器生成的随机数,稍后用于生成”对话密钥”。
    • 确认使用的加密套装。
      Server Hello
  3. Certificate
    服务端发送Server Hello后,将自己的证书发送给客户端。客户端可验证该证书,从而判断是否是自己要与之“对话”的实体。

  4. ServerKeyExchange, Server Hello Done
    ServerKeyExchange当选用DHDHE非对称加密算法进行密钥传输时才有。
    Server Hello Done 表明握手协商完成。
    这一步在#12 Certificate Status封包中。tls协议中的一个封包可以有多个record。
    Server Hello 结束

  5. Client Key Exchange
    用于响应ServerKeyExchange。

  6. ChangeCipherSpec
    客户端告知服务端,从现在开始我发送的都是加密的数据

  7. ChangeCipherSpec
    服务端告知客户端,从现在开始我发送的也是加密的数据

  8. Application Data
    客户端通过ServerKeyExchage得到的公钥,与自己生成的私钥构建出对称加密的密钥,使用该密钥与服务端选定的对称加密算法加密数据并传输。
    服务端通过ClientKeyExchange得到的公钥,与自己生成的私钥也可以构建出与客户端相同的对称加密密钥,并用它进行数据加密。
    关于DH密钥交换算法参见参见百科DH密钥交换算法

这里讲的只是最基本的单向认证过程,即客户端只对服务端进行认证;如果服务端还要认证客户端身份时则要进行双向认证,即服务端还要客户端上传客户端证书进行认证。

参考
维基百科:TLS协议握手
SSL/TLS协议运行机制的概述
https证书认证过程