抓包分析https数据包

说明

  • 192.168.123.1 为服务端
  • 192.168.123.48 为客户端

抓包分析

1. 三次握手建立通信

https使用tcp/ip协议, 客户端和服务端进行通信前也需要经过基础的三次握手

2. 客户端发送Client Hello

该请求将客户端支持的所有SSL/TSL协议版本, 加密算法和一个Random随机数发送给服务端

3. 服务端Server Hello


服务端发送一个Server Hello请求, 表示自己从客户端的Client Hello信息中选择的加密算法, 并返回了自己生成的随机数

4. 服务端 Server Hello Done

服务端发送Server Hello Done表示当前Hello过程结束, 该请求包含了服务端的SSL证书信息

5. 客户端Client Key Exchange

Change Cipher Spec: 客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息

Encrypted Handshake Message: 这一步对应的是 Client Finish 消息,客户端握手结束通知, 表示客户端的握手阶段已经结束


客户端使用服务器发送过来的Certificate中的公钥不重数(随机数)生成前主秘钥并发送给服务器

6. 服务端客户端秘钥生成

  1. 客户端将前主秘钥使用certificate中的公钥加密后发送给服务端后, 客户端使用certificate中的私钥解密之后得到前主秘钥

  2. 客户端和服务端使用相同前主秘钥算法生成主秘钥

  3. 客户端和服务端再次通过相同地主秘钥生成四个密码

    MAC为报文鉴定码

    • E1 : 客户端发送到服务端信息加密密码

    • M1: 客户端到服务端的MAC的加密密码

    • E2: 服务端发送给客户端信息加密密码

    • M2: 服务端到客户端的MAC加密密码

7. 服务端 New Session Ticket

  • New Session Ticket: 来确认密钥交换和认证过程已经成功了。可以传输加密的数据了

  • Change Cipher Spec: 服务端通知客户端后面再发送的消息都会使用前面协商出来的秘钥加密了

  • Encrypted Handshake Message: 服务端握手结束通知, 表示服务端的SSL握手阶段已经结束


8. 客户端和服务端通信

https数据包格式

TLS报文格式为: 类型 + 版本 + 长度 + (数据 + MAC)

其中数据+MAC是加密的, 秘钥使用的是前面的E

其中 MAC = hash(数据 + M) M是前面提到的MAC的加密密码


附加

数字证书内容

包括了加密后服务器的公钥、权威机构的信息、服务器域名,还有经过CA私钥签名之后的证书内容(经过先通过Hash函数计算得到证书数字摘要,然后用权威机构私钥加密数字摘要得到数字签名),签名计算方法以及证书对应的域名。

配置https

1. 获取SSL/TSL证书

  • 域名服务器厂商提供
  • FreeSSL
  • OpenSSL自签证书 (不被浏览器信任)
  • 购买付费证书, 证书价格一般都很高

2. 配置证书

nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;

server_name *.example.com;

# SSL
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# 将80端口http重定向到https
return 301 https://example.com$request_uri;
}

声明

如有错误请联系作者更正