HTTP/2 in Action 中文版
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 HTTPS简介

HTTP最初是一个纯文本协议。HTTP消息以未加密的方式通过互联网发送,因此在消息被路由到目的地的过程中,任何一方都可以读取到消息。顾名思义,互联网是一个计算机网络,而不是一个点对点系统。互联网无法控制消息的路由方式,作为互联网用户,你不知道有多少第三方会看到你的消息。HTTP消息的传播路径很广泛,消息被从ISP(Internet Service Provider,网络服务提供商)发送到电信公司和其他组织。由于HTTP消息是纯文本的,因此可以在途中被拦截、读取甚至更改。

HTTPS是HTTP的安全版本,它使用TLS(Transport Layer Security,传输层加密)协议对传输中的消息进行加密,TLS的前身是我们熟知的SSL(Secure Sockets Layer,安全套接字层),如下面的引文所述。

HTTPS对HTTP消息添加了三个重要概念:

加密——传输过程中第三方无法读取消息。

完整性校验——消息在传输过程中未被更改,因为整个加密消息已经过数字签名,并且该签名在解密之前已通过加密验证。

身份验证——服务器不是伪装的。

SSL、TLS、HTTPS和HTTP

HTTPS使用SSL或TLS加密。SSL是由Netscape发明的。SSLv1从未在Netscape之外发布,因此第一个生产版本是1995年发布的SSLv2。1996年发布的SSLv3解决了一些安全漏洞。

由于SSL由Netscape拥有,因此它不是正式的互联网标准,尽管它随后由IETF作为历史文档发布[24]。SSL被标准化为TLS(传输层加密)。TLSv1.0[25]与SSLv3类似,但它们不兼容。TLSv1.1[26]和TLSv1.2[27]分别于2006年和2008年推出,并且它们更加安全。TLSv1.3在2018年被批准为标准[28]。虽然还需要一些时间它才能普及,但它更安全,更高效[29]

尽管有这些标准化的、更新、更安全的版本可用,许多人还是认为SSLv3已经足够了,所以在很长一段时间内它是事实上的标准,虽然许多客户端已经支持TLSv1.0了。然而,在2014年,在SSLv3中发现了重大漏洞[30],SSLv3因此被要求停止使用[31],并且浏览器也停止对它的支持。从这时人们才开始大量向TLS迁移。在TLSv1.0中发现类似的漏洞后,安全专家强烈建议使用TLSv1.1或更高版本[32]

由于这段历史所造成的影响,人们对这些缩写的用法并不统一。许多人仍然将加密称为SSL,因为它在那么长的一段时间里都是标准。其他人使用SSL/TLS或TLS。有些人试图将其称为HTTPS来避免争论,即使这个术语从严格意义上来讲并不正确。

在本书中,我们将加密称为HTTPS(而不是SSL或SSL/TLS),除非我们专门讨论TLS协议的特定部分。同时,将HTTP的核心语义称为HTTP,无论讨论未加密的HTTP连接,还是加密的HTTPS连接。

HTTPS使用公钥加密,服务器在用户首次连接时以数字证书的形式提供公钥。你的浏览器使用此公钥加密消息,只有服务器可以解密,因为只有它拥有配对的私钥。该系统允许你安全地与网站进行通信,而无须事先知道共享密钥。对于互联网这样的系统,这至关重要,因为每天都会有新的网站和用户。

数字证书由浏览器信任的各种CA(Certificate Authorities,证书颁发机构)发布并进行数字签名,这就是为什么可以验证公钥是否适用于你要连接的服务器。HTTPS的一个重大问题是,它只保证你正在连接到该服务器,而不能保证服务器值得信任。使用相似的域名(如exmplebank.com、examplebank.com),即使使用HTTPS,也可以轻松设置虚假钓鱼站点。HTTPS站点通常在Web浏览器中显示为绿色挂锁,许多用户认为这意味着安全,但其实它仅仅意味着加密

在发布证书并提供扩展验证证书(称为EV证书)时,一些CA会对网站进行一些额外的审查。该证书加密HTTP流量的方式和普通证书的相同,但在大多数Web浏览器中,该证书会显示公司名称,如图1.4所示。

图1.4 HTTPS浏览器标志

很多人对EV证书的优势提出质疑[33],主要是因为绝大多数用户不会注意到公司名称,在使用EV和标准DV(Domain Validated域验证)证书的站点上也没有任何不同的行为。一部分OV(Organizational Validated,组织验证)证书做了一些检查,但没有在浏览器中给出额外的提示,这使得它们在技术层面上基本没有意义(尽管CA会提供额外的支持和担保服务)。

在撰写本书时,Google Chrome团队正在研究和试验这些安全提示[34],试图删除不必要的信息,包括协议名(httphttps)、www前缀,甚至挂锁本身(假设HTTPS是标准情况,那么应该明确将HTTP标记为不安全的)。该团队还在考虑是否要删除EV。[35]

HTTPS是基于HTTP构建的,几乎可以与HTTP协议无缝衔接。它默认在不同的端口上服务(使用443端口,而HTTP的默认端口是80)。它有一个不同的URL协议名(https://而不是http://),但除了加密和解密本身以外,它并没有从根本上改变HTTP的语法或消息格式。

当客户端连接到HTTPS服务器时,它将经历协商阶段(或者叫TLS握手)。在此过程中,服务器提供公钥,客户端和服务器协商所使用的加密方法,然后协商接下来要使用的共享密钥。(公钥加密很慢,因此公钥仅用于协商共享密钥。为了更好的性能,可用共享密钥加密后续的消息。)第4章(4.2.1节)将详细讨论TLS握手。

建立HTTPS会话后,将交换标准HTTP消息。客户端和服务器在发送消息之前加密消息,在接收之前解密消息。但是对于普通的Web开发者或服务器管理员来说,在配置完成后,HTTPS和HTTP没有区别。除非你要查看通过网络发送的原始信息,否则对你来讲一切都是透明的。HTTPS封装标准HTTP请求和响应,而不是用其他协议取代HTTP。

HTTPS是一个很大的主题,详细讨论超出了本书的范畴。在后面的章节中会再次对其做简要介绍,因为HTTP/2给它带来了一些变化。但就目前而言,重要的是要知道HTTPS的存在,并且在比HTTP更低的层面(TCP和HTTP之间)工作。除非你自己查看加密消息,否则你将看不到HTTP和HTTPS之间的真正区别。

对于使用HTTPS的Web服务器,你需要一个能够支持HTTPS加密和解密的客户端,因此你无法再使用Telnet将示例HTTP请求发送到这些服务器。OpenSSL提供了一个s_client命令,可使用该命令将HTTP命令发送到HTTPS服务器,和使用Telnet类似:

现在这些命令行工具已经完成了它们的历史使命,在下一节中,我们将简要介绍一些浏览器工具,它们提供了一种更好的方式来查看HTTP请求和响应。