Https

Http和Https

  • 其实HTTPS就是从 HTTP 加上 SSL/TLS (加密处理+认证+完整性保护)

完整的https通信过程,三次RTT:tcp握手一次RTT,TLS握手两次RTT

img

HTTPS工作原理

image

  • 一、首先客户端发起连接请求,将自身支持的加密(RSA)和哈希算法(sha256)连带发给服务器(服务器端有非对称加密的公钥和私钥)
  • 二、服务器端接受请求,选取一组加密和哈希算法后,将服务器证书(含公钥)发送给客户端
  • 三、客户端收到服务器端证书并使用根证书验证证书后,从中取出公钥,然后本地生成一段随机数,将此随机数用公钥加密后发送给服务器端
  • 四、服务器端用私钥解密出这段随机数作为对称加密的秘钥。之后双方就可以进行对称加密(DES、AES等)。

证书校验过程

校验证书的过程:

第一步是校验证书网站域名、有效期等。

第二步是校验证书本身是否可信:主要是依靠验证证书的信任链条完成。

比如根证书A->B->服务端证书C,那么首先要验证C是由B签署的,这一步的具体步骤是:

1. **用B证书的公钥解密C证书的签名信息后拿到C证书的hash值(签署时该Hash值由B的私钥加密生成),**
2. **然后再用hash算法(B证书上带的签名算法)计算B证书的<u>待签名数据</u>后得到计算hash值,**
3. **将证书解密的hash值与计算hash值比较即可。**

第三步是使用CRL(证书吊销列表)或OCSP(在线证书状态协议)确认证书是否已被吊销。

1
2
3
4
5
6
7
8
9
10
11
12
证书内容可简化为:
待签名数据:
版本: v3
序列号: 123456
签名算法: SHA256withRSA
颁发者信息: CN=A, O=A Corporation, C=US
有效期: 2022-01-01 至 2023-01-01
主题信息: CN=B, O=B Corporation, C=US
主题公钥: (公钥数据)
扩展字段: (可选)
签名:
签名: (签名数据)

image-20240703175159171

image-20211123141219076 image-20211123141130160

抓包软件怎么实现的

以我熟悉的抓包软件whistle为例,抓包软件能抓https内容的核心是:你的手机安装了whistle的自签名根证书,同时你的请求都是代理给whistle的,然后whistle会发送给客户端经自签名根证书签署过的伪造服务器证书,故而能通过客户端的证书校验,从而拿到请求原文。

手机安装了抓包软件的自签名证书后,抓包工具在作为代理进行HTTPS流量捕获时,实际上充当了中间人。抓包开启后,客户端https请求的握手对象实际上是抓包软件,服务端拿到的请求地址是 抓包软件的地址。手机的请求也实际上是与抓包软件在交互,抓包软件再与服务器交互。故而抓包软件能记录并修改客户端的请求与响应

image-20240703170642767

自签名证书:抓包软件生成一个自签名的证书(自签名证书是一种灵活且方便的SSL/TLS证书解决方案,是由证书的所有者自己签发的,适用于于开发测试环境和内部网络。然而,由于它不是由受信任的三方证书颁发机构即CA签发的,使得它无法提供可靠的身份验证,无法适用于公网)

  1. 客户端信任自签名证书
    • 当用户在设备上安装抓包软件的自签名证书后,这个证书被设备作为受信任的根证书。设备会信任由这个自签名证书签发的所有证书。
  2. 中间人代理握手
    • 抓包软件充当“中间人”,拦截客户端的HTTPS请求。客户端发出的请求首先到达抓包软件。
    • 抓包软件向客户端提供一个由它自己的自签名根证书签署的伪造服务器证书(目标服务器的替身证书)。
    • 因为客户端已经信任抓包软件的自签名证书,所以它会信任这个伪造的服务器证书,并与抓包软件进行TLS握手。

这样,手机上的浏览器或应用程序在连接时实际上是与抓包软件建立的https握手

抓包软件的主要目的是捕获、分析和调试网络流量。其工作步骤如下:

  1. 客户端通过代理发送请求
    • 抓包软件配置为代理,客户端配置通过此代理发送所有网络请求。
    • 抓包软件生成一个自签名证书,客户端将其安装为受信任的根证书。
  2. 代理解析并再发送请求
    • 客户端的请求首先由抓包软件接收。对于HTTPS请求,抓包软件会使用自签名证书解密这些请求。
    • 抓包软件记录和分析解密后的请求内容,然后重新加密并发送到目标服务器。
  3. 服务器响应经过代理返回客户端
    • 目标服务器返回响应,抓包软件解密并记录这些响应数据。
    • 抓包软件再重新加密这些数据并发送回客户端。

VPN与抓包软件的原理类似,都是通过一层中间人,将客户端的请求实际上代理到中间人层发起请求。

不同的是由于抓包软件使客户端安装的自签名证书,客户端在证书校验时遇到抓包软件自签名证书签署的伪造服务器证书会校验通过,使客户端的请求都能在中间人层解密后查看和修改,之后抓包再转发。

而VPN则是通过加密隧道(加密整个传输链路):使用协议如IPsec、OpenVPN、L2TP等),在原本就由ssl/tls加密的数据上再加密一层,之后无法感知传输内容原原本本的转发。

HttpProtocol

Http 缓存

在请求一个静态文件的时候(图片,css,js)等,这些文件的特点是文件不经常变化,将这些不经常变化的文件存储起来,对客户端来说是一个优化用户浏览体验的方法。那么这个就是客户端缓存的意义了。

简述:

  • 强制缓存是根据上次响应header中的Cache-Control:Max-age或是Expries客户端直接判断缓存是否能用该资源缓存;

  • 协商缓存需要客户端用记录下来的上次响应header中的ETag或是Last-Modified,通过与向服务器的请求request的header中赋值If-None-Match或If-Modified-Since,由服务器判断资源是否更新,结果由code和是否存在body明确是否命中缓存;

同时出现的优先级排序: 强制缓存 > 协商缓存;ETag & If-None-Match > Last-Modified & If-Modified-Since ;Cache-Control > Expries;

Read more

tcp

简述:

Tcp是

面向链接的
面向字节流的
可靠的(几个点)

保证可靠的手段:

  • 数据分块——握手时协商确定MSS,大于MSS的tcp数据包分段(也就是拆包);序列号;校验和;确认ack包

  • 超时重传——发送方使用一个保守估计的时间作为收到数据包的确认的超时上限RTO。如果超过这个上限仍未收到确认包,发送方将重传这个数据包。每当发送方收到确认包后,会重置这个重传定时器。

    超时重传会触发拥塞控制之重置拥塞窗口为1个MSS,阈值减为当前cwnd一半,执行慢启动每轮往返拥塞倍增

  • 滑动窗口实现的流量控制;接收方在ack包中设置rwnd控制发送方发送速度。

  • 拥塞控制算法——小于阈值之前从1开始每轮往返拥塞窗口cwnd倍增(慢启动),拥塞窗口大于阈值后步长为一的递增(拥塞避免)。接收方收到失序报文段后立即发出重复确认ack包,发送方连续三次重复确认则直接发送缺乏ack的丢包(快速重传),同时把阈值减为cwnd/2并调整拥塞窗口为新阈值而后执行拥塞避免算法(快速恢复);

Ps:

超时重传会触发拥塞控制之重置拥塞窗口为1个MSS,阈值减为当前cwnd一半,执行慢启动每轮往返拥塞倍增;

三次重复确认会执行快速重传快速恢复,阈值减为当前cwnd一半,拥塞窗口为新阈值值,执行拥塞避免,每轮往返递增;

Read more

Socket

Socket

1 什么是Socket

  • 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

  • 但是,Socket所支持的协议种类也不光TCP/IP、UDP,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

  • socket连接就是所谓的长连接,客户端和服务器需要互相连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉的,但是有时候网络波动还是有可能的

  • Socket偏向于底层。一般很少直接使用Socket来编程,框架底层使用Socket比较多,

Read more