HTTP概述
HTTP是一种用于在Web上获取资源内容的通讯协议,它以客户端-服务端为基本模型,客户端如常用浏览器,向Web服务器发起请求,表明需要获取什么资源,服务器将资源包含在响应内返回,因此,http是一种 请求-响应协议。
主要特点
- 简单:可读性强
- 可扩展:在消息头中附加扩展信息
- 无状态,有会话:本身无状态,请求之间无关,但可通过cookie创建有状态的会话,将一个连接中的请求关联。
-
面向连接:HTTP/1.0采用非持续连接,HTTP/1.1增加
Keep-Alive
在一定时间内保持连接
HTTP 消息##
请求消息与响应消息一般结构类似:
POST /downloads?ver=2.2&key=ffD7Y9anV5dZVp8 HTTP/1.1
Host: download.api.bsb.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: text/plain
Content-Length: 42
Connection: close
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: none
Pragma: no-cache
Cache-Control: no-cache
baidu-phish-shavar;
baidu-malware-shavar;
- 第一行一般为请求类型、请求协议
- 接下来为请求头的集合,描述请求相关信息以及对请求内容进行说明
- 一个空行表示关于请求的元数据发送完毕
- 最后为所请求的正文内容(如果有的话)
HTTP请求
起始行通常包含以下元素:
-
Http方法表明对给定资源所执行的操作,为名词或动词
- GET:请求服务器上的资源,用URL查询字符串的形式向请求资源发送参数
- POST:向指定资源提交数据处理请求,数据包含在请求体内,会导致资源建立或修改。
- HEAD:只获取资源响应消息报头
- PUT:请求服务器存储一个资源
- DELETE:请求服务器删除资源
- TRACE:回显服务器收到的请求,主要用于测试或诊断
- OPTIONS:查询服务器的支持选项
GET与POST
- GET的请求方法一般为将参数附在URL之后,而 POST通过
request body
传递参数 - GET所请求的数据会被缓存在浏览器中而POST不会
- GET从服务器上取数据,POST向服务器传数据
HTTP响应
包含以下内容:
- 协议版本、状态码及对状态码的描述
- 响应头:一些类似请求头的信息
- 响应体
常见响应状态码:
- 200 OK:请求成功
- 301 Moved Permanently:请求资源被永久移动
- 404 Not Found:服务器不想解释为何请求被拒绝或者没有其他合适响应可用
- 500 Internal Server Error:服务器执行请求时遇到错误
- 502 Bad Gateway:表示作为网关或代理角色的服务器,从上游服务器中接收到的响应无效
HTTP 安全问题
- 数据未加密
- 无法进行身份验证
- 数据容易被篡改(中间人攻击)
HTTPS
通过引入一系列加密算法来解决以上安全问题。
HTTPS = HTTP + SSL/TLS
TLS(Transport Layer Security)协议为SSL(Secure Socket Layer)协议的升级版,是在SSLv3.0的基础上进行标准化而得到的协议,我们通常所说的SSL协议实际上是TLS。
需要解决明文传输的问题,就要对数据进行加密,并且确保只有服务器和客户端可以对密文进行解密,为了减轻计算压力,此处选择使用对称加密算法,同时用非对称加密算法将对称密钥加密传输。
从HTTP协议到HTTPS协议
将通信内容加密后传输:
- 客户端和服务器端都需要拿到对称密钥,因此对称密钥如何保管和存储将成为重大隐患
因此选择用非对称加密来加密传输对称密钥
- 此时保证了数据内容的加密传输,但客户端和服务器端无法确定对方的身份是否被恶意者冒充(中间人攻击),因此需要增加身份认证。
SSL协议栈
从协议栈这张图可以看出,SSL协议分为两层,上层的SSL握手协议负责协商SSL连接中所需的密钥,SSL记录协议负责对传输数据进行加密签名等处理。SSL报警协议用于通报异常信息,SSL密码变更协议即密码修改时更新此连接所用的密码套件。
SSL握手协议
第一阶段:客户端请求服务端响应
客户端发送client_hello建立连接请求,消息内容包括:
- 版本:客户端SSL最高版本
- 随机序列:防重放
- 会话ID:0表示建立新连接,非0表示更新现有连接的参数
- 密码套件:客户端所支持的密码算法列表
- 压缩方法
服务器收到客户端的请求后回应server_hello,内容对应client_hello,并从中选择密码套件等信息进行回复。
第二阶段:服务器认证和密钥交换
需要认证时,服务器将一个X.509证书或证书链发送,并向客户端请求证书,最后发送server_done
消息。
- 不需要认证时,认证消息执行密钥交换功能
- 如必要,发送服务器密钥交换消息,确定密钥交换参数
- 证书请求中应包含证书类型与证书机构
第三阶段:客户端认证和密钥交换
客户端对收到服务端的证书进行验证,并检查server_hello
是否可接受。条件满足则返回消息。
- 服务器端若请求证书,则首先发送证书
- 发送客户端密钥交换消息确定密钥交换类型
- 最后发送证书验证消息,以便服务器端对证书进行验证
第四阶段:完成
- 使用修改密码规格协议发送修改密码规格消息
- 在新算法、新密钥、新秘密值下发送
finished
消息结束
PKI
PKI即公钥基础设施,是基于非对称密码体制的用来执行与数字证书有关的操作及其所涉及人员制度设施的体系。PKI各个主要素的关系如下:
- 端实体:表示被颁发证书的实体
- 认证中心CA:证书的以及证书撤销列表(CRL)的发放者
- 注册中心RA:与端实体注册有关
- CRL发放者:可选部分,可代理CA发布CRL
- 存储库:存储证书和CRL
主要涉及以下流程:
- 注册:端实体在注册中心进行注册
- 请求证书:端实体向认证中心请求证书
- 双向认证:认证中心之间相互认证颁发证书
SSL记录协议
- 对数据进行分段,将数据分割为不大于2^14字节的块
- 选择是否进行压缩
- 对每一个块计算消息认证码(MAC),大致操作为将数据块与上层协议、压缩算法、长度等信息进行两次嵌套的字符填充与哈希计算得到,并将MAC附在数据块后。
- 将添加MAC后的数据块使用对称密码算法进行加密
- 添加一个包含以下要素的SSL协议头:
- 内容类型:修改密码规范、警报、握手、应用数据
- 主版本号、从版本号及压缩后的长度
SSL报警协议
将与SSL相关的警报传达给对等实体:
不合法参数、结束通知、没有证书、证书不可用、证书过期、非预期消息、MAC记录出错等。