发出Web请求到服务器都经历了什么(四)HTTP与TLS

55 阅读5分钟

HTTP HyperText Transfer Protocol超文本传输写有。传输是有TCP做的。无状态、以请求应答方式运行。使用可扩展语义和自描述消息格式,基于网络超文本系统灵活互动。

报文格式

HTTP协议请求报文和响应报文的结构分为三大部分:

1. 起始行 start line

请求时起始行格式为GET /index.html HTTP1.1; 响应时起始行格式为HTTP/1.1 200 OK

1.1 请求行报文格式

METHOD空格URI空格VERSION换行

请求方式:get、head、put、post等,表示对资源的操作。

请求目标:通常是URI,请求方法要操作的资源。

版本号:报文使用的HTTP协议版本。

1.2 响应行报文

VERSION空格STATUS CODE空格REASON换行

版本号:HTTP协议版本

状态码:代码形式的处理结果,3位数。

原因:数字状态码的补充。

2. 头部字段集合 header

请求头或响应头,例如Connection:keep-alive。以keyvalue形式,之间以:分割,最后由CRLF换行表示字段结束。 注意:

  • 字段名不允许出现空格,不区分大小写,可以用-不可以用_:前必须紧跟字段名,后可以有多个空格。
  • 字段顺序不影响语义
  • 除了一些特例,字段不允许重复,特例例如:Set-Cookie。

常用头字段有:

  • 请求字段

    Host、Refer

  • 响应字段

    Server

  • 通用字段

    Content-type、Connection

3. 空行

4. 消息正文 entity

加密HTTP=HTTPS

HTTP是明文传输,在任意节点都会被截获篡改。因此为了安全性考虑,在原有的HTTP不改变的前提下,在传输层和HTTP之前创建SSL/TLS层(安全层)进行加密。

image.png

SSL/TLS

SSL Secure Sockets Layer安全套接层94年发明,99年改名为TLS Transport Layer Security传输层安全。TLS中使用混合加密方式,把非对称加密和对称加密结合起来。首先服务端事先准备好公钥和私钥。在客户端和服务端建立三次握手之后,进行密钥传输。 公钥数字证书组成:CA信息、公钥用户信息、公钥、权威结构签名、有效期。

除了HTTPS外,TLS可以被应用于任何基于TCP/IP协议的上层协议或应用程序,如SFTP协议,SMTP协议,数据库间通信加密等等。

TLS流程

TLS通讯过程可分为:验证身份、达成安全套件共识、传递密钥、加密通讯。

  1. TCP三次握手
  2. 【Client Hello】客户端会向服务端发送加密套件列表(告诉服务端支持的的散列算法、非对称加密算法、对称加密算法有哪些)、TLS版本和随机数(第一个随机数)。
  3. 【Server Hello】服务端会从客户端支持的加密套件里选择,并发送TLS版本以及随机数(第二个随机数)。
  4. 【Certificate】服务端会再发送一个响应告诉客户端公钥数字证书(不是普通公钥而是公钥数字证书。这样可以避免在TCP三次握手时被黑客拦截,使客户端一直在和虚假的服务器进行交互),出示服务器自己的证书。
  5. 【Server Key Exchange】服务端再发送公钥[如果服务端也想要客户端的证书就会在这里发出请求,比如登录网银]
  6. 【Server Hello Done】发送完了
  7. 【Client Key Exchange、Change Cipher Spec、Encrypted Handshake Message】客户端验证证书(对照自己的证书信任列表确认服务器是否可信),
  • Client Key Exchange

    生成预主密钥/第三随机数,不会直接发送出去,会用刚才的公钥加密后发送出去

  • Change Cipher Spec

    告诉服务端后面数据用协商好的算法密钥加密

  • Encrypted Handshake Message

    标识客户端这边TLS协商没有问题了,加密开始

  1. 【Encrypted Handshake Message】服务端收到后用私钥解密,获取预主密钥。双方都能计算出会话密钥

    客户端可以用第1随机数、第2随机数和预主密钥计算出会话密钥,服务端也可以用第1随机数、第2随机数、预主密钥计算出会话密钥。

  2. 【Application Data】使用对称加密算法进行加密双向传输 image.png

总结:TLS的关键步骤就是,服务器会生成公钥私钥,讲公钥传递给客户端,客户端会生成一个随机数,用随机数加密公钥后传递给服务端,服务端接收后用私钥进行解密就可以得到这个客户端生成的随机数,这个随机数现在客户端和服务端都有了,之后在传输数据的时候,就通过这个随机数进行对称加密所有内容。至始至终,这个随机数没有在网络中暴露传输过,因此在网络层面来说,可以预防中间人攻击。

预防中间人攻击

首先这个随机数作为密钥没有在网络中暴露过,因此可以预防攻击。同时预防黑客直接截获,装作请求服务器。因此需要数字证书。

摘要算法

md5、sha1、sha2、sha1 256都是摘要算法,我们可以将任意长度经过摘要算法获取固定长度。

数字证书/SSL证书

数字证书组成:CA信息、公钥用户信息、公钥、权威结构签名、有效期。 SSL证书,实际上就是保存在源服务器的数据文件。SSL证书需要向CA申请。整个证书表明域名属于谁、日期等信息,还包括了特定的公钥和私钥。

  • 证书指纹

    使用哈希加密,用于标识唯一一个证书。

  • 数字签名

对称加密

编解码时,使用相同密钥/使用相同规则。可以使用异或其他来实现。另外常见有AES、RC4、ChaCha20等。

非对称加密

公钥加密,私钥解密。 如DH、DSA、RSA、ECC等。

image.png

参考:

  1. www.bilibili.com/video/BV1KY…