JobbyM's Blog

一日一练-网络 了解HTTPS

子曰:了解HTTPS

一日一练-网络 了解密码学史 中的Bob 了解了密码学,最终同Alice 幸福生活在里一起。在幸福生活之余,Bob 不忘继续学习HTTPS。

HTTPS 是最常见的HTTP 安全版本。HTTPS 将HTTP 协议与一组强大的对称、非对称和基于证书的加密技术结合在一起,使得HTTPS 不仅很安全,而且很灵活,很容易在处于无序状态的、分散的全球互联网上进行管理。

HTTPS 在将HTTP 报文发送给TCP 之前,先将其发送给了一个安全层,对其进行加密。

现在,HTTP 安全层是通过SSL 及其现代替代协议TLS 来实现的。我们遵循常见的用法,用术语SSL 来表示SSL 或者TLS。

SSL协议

SSL 协议位于TCP/IP 协议与各种引用层协议之间,为数据通信提供安全支持。SSL 协议可分为两层:

  1. SSL 记录协议(SSL Record Protocol):
    它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。
  2. SSL 握手协议(SSL Handshake Protocol):
    它建立在SSL 记录协议之上,用于在实际的数据传输开始之前,通讯双方进行身份认证、协商机密算法、交换加密密钥等。

SSL 协议可以在OSI(Open System Interconnection) 七层模型中的会话层和传输层进行一一对应

  1. 会话层(Session Layer):
    对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。例如,确定是双工还是半双工工作。
  2. 表示层(Presentation Layer):
    主要任务是把传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中标准表示形式。此外,对传送的数据加密(或解密)、正文压缩(或还原)也是表示层的任务。

HTTPS方案

在安全HTTPS 协议中,URL 的方案前缀是https。请求一个客户端(比如Web 浏览器)对某Web 资源执行某事务时,它会检查URL 的方案。

  1. 如果URL 的方案为http,客户端就会打开一条到服务器端口(默认情况下)的了解,并想起发送HTTP 命令
  2. 如果URL 的方案为https,客户端就会打开一条到服务器端口443(默认情况下)的连接,然后与服务器“握手”,以二进制格式与服务器交换一些SSL 安全参数,附上加密的HTTP 命令。

建立安全传输

在HTTPS 中,客户端首先打开一条到Web 服务器端口443 的连接。一旦建立了TCP 连接,客户端和服务器救护初始化SSL 层,对加密参数进行沟通,并将换密钥。握手完成之后,SSL 初始化就完成了,客户端就可以将请求报文发送给安全层。在将这些报文发送给TCP之前,要先对其进行加密。

在通过网络传输任何以加密的HTTP 数据之前,SSL 已经发送了一组握手数据来建立通信连接了,上图中的HTTPS 事务中的第2 步,下图显示SSL 握手的基本思想。

服务器证书

SSL 支持双向认证,将服务器证书承载回客户端,再将客户端的证书回送给服务器。

站点证书的有效性

SSL 自身不要求用户检查Web 服务器证书,但大部分现代浏览器都会对证书进行简单的完整性检查,并为用户提供进一步彻查的手段。

OpenSSL

SSL 是一个复杂的二进制协议。除非你是密码专家,否则就不应该直接发送原始的SSL 流量。借助一些商业或开源的库,编写SSL 客户端和服务器并不十分困难。

OpenSSL 就是SSL 和TLS 最常见的开源实现。其目标是开发一个强壮的、具有完备功能的商业级工具集,以实现SSL 和TLS 协议以及一个全功能的通用加密库。

通过代理以隧道形式传输安全流量

客户端通常会用Web 代理服务器来访问Web 服务器,代理是防火墙路由器唯一允许进行HTTP 流量交换的设备。

只要客户端开始用服务器的公开密钥对发往服务器的数据进行加密,代理就再也不能读取HTTP 首部了!代理不能读取HTTP 首部,就无法知道应该将请求转向何处了。

为了使HTTPS 与代理配合工作,要进行几处星期以告知代理连接到何处。一种常用的技术就是HTTPS SSL 隧道协议。使用HTTPS 隧道协议,客户端首先要告知代理,它想要连接的安全主机和端口。这是在开始加密之前,以明文形式告知的,所以代理可以理解这条信息。

HTTP 通过新的名为CONNECT 的扩展方法来发送明文形式的端点信息。CONNECT 方法会告诉代理,打开一条到所期望主机和端口号的连接。这项工作完成之后,直接在客户端和服务器之间以隧道形式传输数据。CONNECT 方法就是一条单行的文本命令,它提供里由冒号分隔的安全原始服务器的主机名和端口号。host:port 后面跟着一个空格和HTTP 版本字符串,在后面是CRLF。接下来是0 个或多个HTTP 请求行首部,后面跟着一个空行。空行之后,如果建立连接的握手过程成功完成,就可以开始传输SSL 数据了。

下面是一个例子:

1
2
3
4
CONNECT home.netscape.com:443 HTTP/1.0
User-agent: Mozilla/1.1N

<raw SSL-encrypted data would follow here...>

在请求中的空行之后,客户端会等待来自代理的响应。代理会对请求进行评估,确保它是有效的,而且用户有权请求这样一条连接。如果一切正常,代理会建立一条到目标服务器的连接。如果成功,就像客户端发送一条200 Connection Established 响应。

1
2
HTTP/1.0 200 Connection established
Proxy-agent: Netscape-Proxy/1.1

参考文档

  1. 《HTTP 权威指南》 第14 章 安全HTTP