HTTP vs. HTTPS:深入理解差异与 HTTPS 全流程
前言
当我们在浏览器地址栏输入网址时,通常会看到 http://
或 https://
开头。虽然只差一个 “S”,但它们代表着截然不同的网络通信方式,尤其在安全性方面。理解 HTTP 与 HTTPS 的区别以及 HTTPS 的工作原理,对于 Web 开发者和关心网络安全的用户都至关重要。
什么是 HTTP?
HTTP (Hypertext Transfer Protocol),即超文本传输协议,是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它是互联网上应用最为广泛的一种网络协议,所有的 WWW 文件都必须遵守这个标准。
HTTP 的主要特点:
- 无连接: 限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接(现代 HTTP 版本如 HTTP/1.1 支持持久连接 Keep-Alive)。
- 无状态: 协议对于事务处理没有记忆能力。每个请求都是独立的,服务器不知道客户端之前的请求历史。这通常需要 Cookie 或 Session 等机制来维持状态。
- 明文传输: 这是 HTTP 最致命的缺点。所有传输的数据(包括用户名、密码、银行卡信息等)都是未加密的,在传输过程中容易被窃听、截取和篡改。
什么是 HTTPS?
HTTPS (Hypertext Transfer Protocol Secure),即安全超文本传输协议。简单来说,它就是 HTTP 的安全版本。HTTPS 在 HTTP 的基础上加入了 SSL/TLS 协议,依靠 SSL/TLS 来加密数据包、验证服务器身份和保证数据完整性。
HTTPS 的核心优势:
- 数据加密: 通信内容通过对称加密和非对称加密技术进行加密,即使被截获,攻击者也无法轻易解密获取真实内容。
- 身份认证: 通过数字证书验证服务器的真实身份,防止用户访问到仿冒的钓鱼网站。
- 数据完整性: 通过消息认证码(MAC)校验数据在传输过程中是否被篡改。
HTTP 与 HTTPS 的主要区别
特性 | HTTP | HTTPS |
---|---|---|
安全性 | 明文传输,不安全 | 使用 SSL/TLS 加密,安全 |
协议层 | 应用层协议 | HTTP + SSL/TLS 协议(在传输层和应用层之间) |
URL 前缀 | http:// | https:// |
默认端口 | 80 | 443 |
证书 | 不需要 | 需要 CA 颁发的 SSL/TLS 证书 |
连接过程 | 简单,TCP 三次握手后直接传输 HTTP 报文 | TCP 三次握手后,还需要进行 SSL/TLS 握手 |
性能 | 性能开销小 | 建立连接(握手)有一定性能开销,但传输过程影响不大 |
SEO | 不利于 SEO | 对 SEO 友好,被搜索引擎(如 Google)推荐 |
HTTPS 的网络全流程详解
HTTPS 的通信过程比 HTTP 复杂,主要增加了 SSL/TLS 握手 阶段。以下是简化但关键的步骤:
前提: 客户端(如浏览器)发起 HTTPS 请求,例如访问 https://example.com
。
DNS 解析 (与 HTTP 相同):
- 客户端查询 DNS 服务器,获取
example.com
对应的 IP 地址。
- 客户端查询 DNS 服务器,获取
TCP 三次握手 (与 HTTP 相同):
- 客户端向服务器的 443 端口 发起 TCP 连接请求(SYN 包)。
- 服务器响应 SYN-ACK 包。
- 客户端发送 ACK 包,TCP 连接建立。
SSL/TLS 握手 (HTTPS 核心):
- a. Client Hello: 客户端向服务器发送
Client Hello
消息,包含:- 客户端支持的 TLS/SSL 版本号列表。
- 客户端支持的加密套件 (Cipher Suites) 列表(包含加密算法、密钥交换算法、哈希算法等)。
- 一个客户端生成的随机数 (
client_random
)。 - (可选)支持的压缩方法。
- (可选)扩展字段,如 SNI(Server Name Indication),用于指示客户端想访问哪个域名(在同一 IP 有多个 HTTPS 站点时很重要)。
- b. Server Hello: 服务器收到
Client Hello
后,回应Server Hello
消息,包含:- 从客户端列表中选定的 TLS/SSL 版本号。
- 从客户端列表中选定的加密套件。
- 一个服务器生成的随机数 (
server_random
)。 - (可选)选定的压缩方法。
- c. Certificate (服务器证书): 服务器发送其 数字证书(通常是 X.509 格式)给客户端。证书包含了:
- 服务器的公钥。
- 证书颁发机构 (CA) 的信息。
- 证书的有效期。
- 证书持有者的信息(如域名)。
- CA 的数字签名。
- d. (可选) Certificate Request: 如果服务器需要验证客户端身份(双向认证),会发送此消息请求客户端证书。大多数情况下不需要。
- e. Server Key Exchange (可选): 根据选择的密钥交换算法(如 Diffie-Hellman),服务器可能需要发送额外的数据(如 DH 参数)。对于 RSA 密钥交换,此步可能省略。
- f. Server Hello Done: 服务器通知客户端,初始协商信息发送完毕。
- g. 客户端证书验证: 客户端收到服务器证书后,进行验证:
- 检查证书是否由受信任的 CA 签发(查找操作系统或浏览器内置的根证书)。
- 验证证书链。
- 检查证书是否在有效期内。
- 检查证书的域名是否与正在访问的域名 (
example.com
) 匹配。 - (可选)通过 OCSP 或 CRL 检查证书是否已被吊销。
- h. Client Key Exchange: 客户端证书验证通过后,生成另一个随机数,称为 Pre-master Secret。然后:
- 使用服务器证书中的公钥对这个
Pre-master Secret
进行非对称加密。 - 将加密后的
Pre-master Secret
发送给服务器。
- 使用服务器证书中的公钥对这个
- i. (可选) Certificate Verify: 如果服务器请求了客户端证书(步骤 d),客户端会发送一个数字签名证明自己拥有该证书的私钥。
- j. Change Cipher Spec: 客户端通知服务器,后续通信将使用协商好的加密套件和生成的会话密钥进行加密。
- k. Encrypted Handshake Message (Finished): 客户端将前面所有握手消息的摘要,使用会话密钥进行对称加密后发送给服务器。这是对握手过程的校验。
- l. 服务器解密与验证:
- 服务器使用自己的私钥解密客户端发来的
Pre-master Secret
(步骤 h)。 - 服务器和客户端现在都拥有了
client_random
、server_random
和Pre-master Secret
。双方使用相同的算法(在协商的加密套件中定义)独立计算出本次会话的对称加密密钥(Session Key)。
- 服务器使用自己的私钥解密客户端发来的
- m. Change Cipher Spec: 服务器通知客户端,后续通信也将使用协商好的会话密钥进行加密。
- n. Encrypted Handshake Message (Finished): 服务器同样将前面所有握手消息的摘要,使用会话密钥进行对称加密后发送给客户端,供客户端验证。
至此,SSL/TLS 握手完成。 客户端和服务器已经安全地协商出了用于本次会话的对称加密密钥。
- a. Client Hello: 客户端向服务器发送
加密的 HTTP 通信:
- 客户端使用协商好的会话密钥(对称加密)加密 HTTP 请求(如 GET /index.html HTTP/1.1)。
- 服务器使用会话密钥解密请求,处理后,再用会话密钥加密 HTTP 响应。
- 客户端使用会话密钥解密响应,渲染页面。
- 此阶段的所有 HTTP 数据都通过对称加密进行保护,效率较高。
TCP 四次挥手 (与 HTTP 相同):
- 当数据传输完成,任何一方(通常是客户端)发起关闭连接的请求 (FIN)。
- 另一方确认 (ACK)。
- 另一方也发送 FIN。
- 发起方确认 (ACK),TCP 连接断开。
为什么我们应该总是使用 HTTPS?
- 保护用户隐私: 防止敏感信息(密码、支付信息等)在传输中被窃取。
- 数据完整性: 防止传输内容被中间人篡改(如注入广告、恶意脚本)。
- 身份认证: 确保用户访问的是真实的目标网站,而非钓鱼网站。
- 提升信任度: 浏览器地址栏的 “锁” 标志能增加用户的信任感。
- SEO 优势: Google 等搜索引擎已将 HTTPS 作为排名因素之一。
- 现代 Web 功能需求: 许多新的浏览器 API(如 Service Workers, Geolocation)要求必须在 HTTPS 环境下才能使用。
结论
HTTPS 通过在 HTTP 和 TCP 之间增加一层 SSL/TLS 安全协议,极大地增强了 Web 通信的安全性。虽然握手过程增加了初始连接的开销,但其带来的数据加密、身份认证和完整性保护对于现代互联网至关重要。部署 HTTPS 已经不再是选项,而是保护网站和用户的基本要求。