浅析 HTTPS (SSL/TLS) 握手协议

超文本传输安全协议 (HTTPS, Hypertext Transfer Protocol Secure) 常称为HTTP over TLS,HTTP over SSL或HTTP Secure, 是一种使用计算器网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
传输层安全性协议 (TLS, Transport Layer Security) ,及其前身 安全套接层(SSL,Secure Sockets Layer)是一种安全协议,目的是为互联网通信,提供安全及数据完整性保障。网景公司推出HTTPS协议时,以SSL进行加密,这是SSL的起源。IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与 RFC 6176 (2011年3月)。TLS/SSL 不仅为浏览器提供支持,在邮箱、即时通信、VoIP、网络传真等应用程序中也得到广泛应用。
由此可知,HTTPS 是在 SSL/TLS 之上承载 HTTP 。与HTTP 不同,HTTPS 使用 https:// 做为URL前缀, 默认端口为 443.
为方便,后面将 SSL/TLS 简写为 TLS.

 

协议的层次

TLS 协议为由 TLS记录协议(TLS record protocol) 与 TLS握手协议(TLS handshake protocol) 这两层协议叠加而成。记录协议负责进行加密,握手协议负责进行加密之外的其它操作。

 

  1. TLS记录协议 位于握手协议的下层,负责对消息进行加密。它使用了对称加密和消息认证,但具体的算法和共享密钥则是通过握手协议在服务端和客户端之间协商决定的。
  2. TLS握手协议 分为4个子协议
    • 握手协议 负责在客户端与服务端之间协商决定密码算法和共享密钥。基于证书的认证操作也是在这个协议中完成。在握手协商一致后,双方会互发信号来切换密码。
    • 密码规格变更协议 负责向通信对象传达密码变更的信号。
    • 警告协议 负责在发生错误时将错误信息传递给对方。如果没有发生错误,接下来会使用应用数据协议进行通信。
    • 应用数据协议 负责将TLS 上面承载的应用数据传达给通信对象

阅读更多

Socks5 协议

SOCKS 是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间代理传递 。SOCKS是 "SOCKetS" 的缩写。目前其最新的版本是5,相比于前一个版本,其新增了 IPv6, UDP 及 验证。
根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。

协议详情

一个 socks5 连接的过程主要有两部分,协商与请求,如果协商后需要验证,则还包含验证的部分。

(1) 认证方法协商

客户端向服务端发出连接认证方法协商请求

  • VER 是 SOCKS 的版本,此处是 0x05
  • NMETHODS 是 METHODS 部分数据的长度,即客户端支持的认证方式的 count
  • METHODS 是客户端支持的认证方式列表,每个方法占一个字节
    • 0x00 不需要认证
    • 0x01 GSSAPI
    • 0x02 用户名密码认证
    • 0x03 - 0x7F 由 IANA分配(保留)
    • 0x80 - 0xFE 私人方法(保留)
    • 0xFF 无可接受的方法

服务器回应协商,从客户端提供的方法中选择一个并通知客户端:

  • VER 是SOCKS的版本号,此处应为 0x05
  • METHOD 是服务端选中的方法。如果不支持客户端提供的所有方法,则返回 0xFF

(2) 认证

阅读更多

网络协议详解之 HTTP 协议

概述

HTTP(HyperText Transfer Protocal)超文本传输协议, 是一个基于请求与响应模式的、无状态的应用层协议。它是 WEB 上应用最广泛的协议。它一般基于 TCP 的连接方式。其主要特点有:

  • 支持 C/S 通信模式
  • 简单快速。HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信快。
  • 灵活。HTTP 协议允许客户端和服务端传输任意类型任意格式的数据。不同的类型由 Content-Tyoe 标记
  • 面向无连接。无连接是指每次建立的连接只处理一个文请求。
  • 无状态。无状态是指协议对于事务处理没有记忆能力。如果后续处理需要前面的信息,则它必须重传。这样可有导致每次连接传送的数据量增大。

HTTP URL

URL(Uniform Resource Locator) 统一资源定位符,它包含了查找某个资源的信息。其格式如下:

http://host[:port][abs_path]

http 指定协议的名称,表示要通过 HTTP 协议来定位网络资源。 host 是一个合法的网络域名 或 IP 地址。 port 指定使用的网络端口,缺省值为 80 。 abs_path 指定请求的资源的 URI .如果 URL 中没有给出 URI, 则必须以 "/" 符号结束(这个工作通常由浏览器完成)。

连接

浏览器与服务器联系的最常用方法是与服务器的 80 端口建立 TCP 连接。使用 TCP 的意义在于,浏览器和服务器都不需要担心如何处理长消息、可靠性与拥塞控制,这些事将由 TCP 来处理。 在早期的 HTTP1.0 中,连接建立起来后会在一个请求和一个响应后立即释放。因为那时的 HTML 很简单,基本只有文本,使用这种模式就够了。但是随着时代的发展,HTML里包含了太多的东西,使用单独的 TCP 来传递每个资源代价太大。于是 HTTP1.1诞生了,它支持持续连接(persistent connection),它可以在一个 TCP 连接上进行多次请求响应,还可以发送流水线请求。这种做法减少建立多个 TCP 连接所用的时间,减少服务器的空闲时间,提高了性能。

HTTP 协议的请求

每个 HTTP Request (请求) 由一行或多行 ASCII 文本组成。其中第一行的第一个词为请求方法的名称,然后是请求资源的 URI,再后是协议的版本。这几个部分使用空格分开:

Method Request-URI  HTTP-Version CRLF

Method 为请求方法,必须为大写。 Request-URI 是一个统一资源标识符。  HTTP-Version 表示请求的 HTTP 协议版本。 CRLF 表示换行符。 例如:

GET about.html  HTTP/1.1

常用的请求方法如下:

阅读更多