为什么 HTTP 不安全?| HTTP 与 HTTPS

HTTP 请求和响应以明文形式发送,这意味着任何人都可以读取它们。HTTPS 通过使用 TLS/SSL 加密来纠正这个问题。

学习目标

阅读本文后,您将能够:

  • 了解 HTTP 的工作方式
  • 了解为什么 HTTP 不安全
  • 说明 HTTP 与 HTTPS 之间的区别
  • 了解如何获取 SSL 证书以启用 HTTPS

相关内容


想要继续学习吗?

订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

使用 Cloudflare 的免费 SSL/TLS 提高安全性和信任度

HTTP 与 HTTPS:有什么区别?

HTTPS 是支持加密和验证的 HTTP。两种协议的唯一区别是HTTPS 使用 TLS (SSL) 来加密普通的 HTTP 请求和响应,并对这些请求和响应进行数字签名。因此,HTTPS 比 HTTP 安全得多。使用 HTTP 的网站的 URL 中带有 http://,而使用 HTTPS 的网站则带有 https://。

HTTP 与 HTTPS

什么是 HTTP?

HTTP 代表超文本传输协议,它是一种用于通过网络传输数据的协议,或是一种表示信息的规范顺序和语法。通过互联网发送的大多数信息(包括网站内容和 API 调用)都使用 HTTP 协议。HTTP 消息主要有两种:请求和响应。

在 OSI 模型中(请参阅什么是 OSI 模型?),HTTP 是第 7 层协议。

什么是 HTTP 请求?什么是 HTTP 响应?

用户与浏览器交互时,用户浏览器会生成 HTTP 请求。例如,如果用户点击一个超链接,浏览器将针对对应页面上出现的内容发送一系列“HTTP GET”请求。如果有人在 Google 中搜索“什么是 HTTP?”,那么本文会出现在搜索结果中,当他们点击其链接时,浏览器将创建并发送一系列 HTTP 请求以获取呈现页面所需的信息。

这些 HTTP 请求全部传送到源站服务器或代理缓存服务器,并且服务器将生成 HTTP 响应。HTTP 响应是对 HTTP 请求的回答。

典型的 HTTP 请求是什么样的?

简单来说,HTTP 请求是遵循 HTTP 协议的一系列文本行。GET 请求可能如下所示:


GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en

用户浏览器生成的这部分文本将通过 Internet 发送。而问题在于,它是明文形式发送的,监视连接的任何人都能读取它。(不熟悉 HTTP 协议的人可能觉得此文本难以理解,但任何对协议的命令和语法有基本了解的人都能轻松读懂。)

当用户通过网站或 Web 应用程序提交敏感数据时,这尤其是一个问题。敏感数据可能是密码、信用卡号,或在表单中输入的任何其他数据。而且在 HTTP 中,所有这些数据都以明文形式发送,任何人都能读取。(当用户提交表单时,浏览器会将其转换为 HTTP POST 请求,而不是 HTTP GET请求。)

源站服务器收到 HTTP 请求时,将发送 HTTP 响应,其类似于:


HTTP/1.1 200 OK
Date: Wed, 30 Jan 2019 12:14:39 GMT
Server: Apache
Last-Modified: Mon, 28 Jan 2019 11:17:01 GMT
Accept-Ranges: bytes
Content-Length: 12
Vary: Accept-Encoding
Content-Type: text/plain

Hello World!

如果网站使用 HTTP 而非 HTTPS,则监视会话的任何人都可以读取所有请求和响应。本质上,恶意行为者可以只读取请求或响应中的文本,就能知道某人正在索取、发送或接收的确切信息。

什么是 HTTPS?

HTTPS 中的 S 代表“安全”。HTTPS 使用 TLS(或 SSL)来加密HTTP 请求和响应,因此在上例中,攻击者看到的不是其文本,而是一堆看似随机的字符。

攻击者不会看到:


GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en

而会看到类似如下:


t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1H5miNieJeJ/FNUjgH0BmVRWII6+T4MnDwmCMZUI/orxP3HGwYCSIvyzS3MpmmSe4iaWKCOHQ==

在 HTTPS 中,TLS/SSL 如何加密 HTTP 请求和响应?

TLS 使用一种称为公钥加密的技术:密钥有两个,即公钥和私钥,其中公钥通过服务器的 SSL 证书与客户端设备共享。当客户端打开与服务器的连接时,这两个设备使用公钥和私钥商定新的密钥(称为会话密钥),以加密它们之间的后续通信。

然后,所有 HTTP 请求和响应都使用这些会话密钥进行加密),使任何截获通信的人都只能看到随机字符串,而不是明文。

有关加密和密钥的工作原理的更多信息,请参阅什么是加密?

HTTPS 如何帮助验证 Web 服务器身份?

身份验证是指核实一个人或一台计算机是否是声称的身份。HTTP 中没有身份验证,它基于信任原则。HTTP 的架构师不一定是做出了隐式信任所有 Web 服务器的决定;他们当时除了安全以外还有其他优先事务。但在现代 Internet 上,身份验证是不可或缺的。

就像身份证件能确认一个人的身份一样,私钥可以确认服务器的身份。当客户端打开与源站服务器的连接通道时(例如,当用户导航到网站时),拥有与网站 SSL 证书中公钥匹配的私钥可证明此服务器确实是该网站的合法主机。这可以防止或帮助阻止在没有身份验证时可能发生的多种攻击,例如:

此外,SSL 证书由签发它的证书颁发机构进行数字签名。这可以确认服务器就是它声称的身份。

Cloudflare 如何使网站采用 HTTPS?

Cloudflare 于 2014 年发布了 Universal SSL,也是第一家免费提供 SSL 证书的公司。任何注册了 Cloudflare 服务的网站都可以一键启用 HTTPS 并告别 HTTP。这使得 TLS 加密广泛可用,进而保护整个互联网上的用户和用户数据。

要了解有关 HTTP 和 HTTPS 的更多信息,请参阅什么是混合内容?