MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

HTTPS在Web浏览器中的安全机制解析

2022-10-054.0k 阅读

HTTPS 基础概念

在深入探讨 HTTPS 在 Web 浏览器中的安全机制之前,我们先来回顾一下 HTTPS 的基本概念。HTTPS 即超文本传输安全协议(Hyper - Text Transfer Protocol Secure),它是在 HTTP 的基础上通过添加 SSL/TLS 协议层来实现加密传输和身份认证等安全功能。

HTTP 与 HTTPS 的区别

HTTP 是一种明文传输协议,在网络上传输的数据没有经过加密,很容易被中间人截取、篡改和监听。例如,用户在 HTTP 网站上登录,用户名和密码会以明文形式在网络中传输,黑客只要在数据传输的路径上进行监听,就能获取到这些敏感信息。

而 HTTPS 通过 SSL/TLS 协议对传输的数据进行加密,即使数据被截取,由于没有解密密钥,截取者也无法获取到真实内容。同时,HTTPS 还能通过数字证书对网站的身份进行认证,防止用户访问到伪造的网站。

SSL/TLS 协议概述

SSL(安全套接层,Secure Sockets Layer)及其继任者 TLS(传输层安全,Transport Layer Security)是实现 HTTPS 安全功能的核心协议。TLS 是 SSL 的升级版,目前广泛使用的是 TLS 1.2 和 TLS 1.3 版本。

SSL/TLS 协议工作在传输层和应用层之间,它为应用层数据提供加密、完整性保护和身份认证。其工作过程大致分为以下几个阶段:

  1. 握手阶段:客户端和服务器进行一系列的消息交换,协商加密算法、密钥等参数,并对服务器身份进行认证。
  2. 加密通信阶段:握手完成后,双方使用协商好的密钥对数据进行加密传输。

HTTPS 在 Web 浏览器中的安全机制

数字证书与身份认证

在 HTTPS 通信中,数字证书是实现服务器身份认证的关键。当用户在浏览器中输入一个 HTTPS 网址时,浏览器会向服务器请求数字证书。

  1. 数字证书的结构 数字证书包含了很多重要信息,如证书颁发机构(CA,Certificate Authority)的名称、服务器的域名、公钥以及证书的有效期等。以 X.509 证书为例,它的基本结构如下:
版本号
序列号
签名算法
颁发者
有效期
主体
主体公钥信息
颁发者唯一标识符(可选)
主体唯一标识符(可选)
扩展(可选)
签名
  1. 证书颁发与信任链 服务器的数字证书由受信任的证书颁发机构(CA)颁发。CA 本身有自己的根证书,这个根证书被预装在大多数操作系统和浏览器中,形成了信任基础。当浏览器收到服务器的证书时,它会从证书的颁发者开始,沿着信任链向上验证,直到找到预装的根证书。如果整个信任链验证通过,浏览器就认为服务器的身份是可信的。

例如,Let's Encrypt 是一个知名的免费 CA,许多网站使用它颁发的证书。当浏览器收到 Let's Encrypt 颁发的证书时,它会验证 Let's Encrypt 的中级证书,而中级证书又由 Let's Encrypt 的根证书签名,浏览器内置了 Let's Encrypt 的根证书,从而完成整个信任链的验证。

  1. 证书验证失败的情况 如果证书验证失败,浏览器会向用户显示警告信息。常见的证书验证失败原因包括:
  • 证书过期:证书有一定的有效期,超过有效期后,证书将不再被认为是可信的。
  • 域名不匹配:证书上的域名与用户访问的域名不一致,这可能意味着用户访问的是一个伪造的网站。
  • 证书链不完整:如果浏览器无法从服务器提供的证书构建完整的信任链,验证也会失败。

加密与密钥交换

  1. 对称加密与非对称加密 在 HTTPS 中,同时使用了对称加密和非对称加密技术。
  • 对称加密:使用相同的密钥进行加密和解密,加密和解密速度快,适合大量数据的加密传输。常见的对称加密算法有 AES(高级加密标准,Advanced Encryption Standard)等。例如,在 AES - 256 算法中,使用 256 位的密钥对数据进行加密。
  • 非对称加密:使用一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据。非对称加密的优点是密钥管理方便,适合在双方不共享密钥的情况下进行安全通信。常见的非对称加密算法有 RSA、ECC(椭圆曲线密码学,Elliptic Curve Cryptography)等。
  1. 密钥交换过程 在 HTTPS 握手阶段,客户端和服务器需要协商出一个对称加密密钥,这个过程称为密钥交换。以 TLS 1.2 为例,常见的密钥交换算法有 RSA 和 ECDHE(椭圆曲线迪菲 - 赫尔曼密钥交换,Elliptic Curve Diffie - Hellman Ephemeral)。
  • RSA 密钥交换:服务器将自己的公钥包含在数字证书中发送给客户端。客户端生成一个随机数作为对称加密密钥,使用服务器的公钥对其进行加密,然后发送给服务器。服务器使用自己的私钥解密得到对称加密密钥。
  • ECDHE 密钥交换:客户端和服务器各自生成一个临时的椭圆曲线密钥对。双方交换公钥,然后使用对方的公钥和自己的私钥计算出一个共享的秘密值。这个共享秘密值通过一定的算法生成对称加密密钥。ECDHE 的优点是每次会话生成的密钥都是临时的,即使私钥被泄露,之前的通信内容也不会被解密,提高了安全性。
  1. 前向保密(Forward Secrecy) 前向保密是 HTTPS 的一个重要特性,它确保即使未来服务器的私钥被泄露,过去的通信内容仍然是安全的。ECDHE 密钥交换算法就实现了前向保密。由于每次会话的密钥都是临时生成的,并且不依赖于长期的服务器私钥,所以即使私钥被获取,攻击者也无法解密之前的通信数据。

数据完整性保护

在 HTTPS 通信中,除了加密和身份认证,数据完整性保护也非常重要。为了防止数据在传输过程中被篡改,SSL/TLS 协议使用了消息认证码(MAC,Message Authentication Code)技术。

  1. MAC 的原理 MAC 是通过对数据和一个共享密钥进行特定算法计算得到的一个固定长度的摘要。在 HTTPS 中,发送方在发送数据时,会计算数据的 MAC 值,并将其与数据一起发送。接收方收到数据后,使用相同的密钥和算法重新计算 MAC 值,如果计算得到的 MAC 值与接收到的 MAC 值一致,则说明数据在传输过程中没有被篡改。

  2. 常见的 MAC 算法 在 TLS 协议中,常见的 MAC 算法有 HMAC - SHA256(基于哈希的消息认证码,使用 SHA256 哈希算法)等。例如,HMAC - SHA256 算法通过将数据和密钥作为输入,经过一系列的哈希计算得到一个 256 位的 MAC 值。

代码示例

下面我们通过 Python 代码示例来演示一个简单的 HTTPS 客户端 - 服务器通信过程,使用 socket 库和 ssl 库来实现。

服务器端代码

import socket
import ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain(certfile='server.crt', keyfile='server.key')

bindsocket = socket.socket()
bindsocket.bind(('127.0.0.1', 8443))
bindsocket.listen(5)

while True:
    newsocket, fromaddr = bindsocket.accept()
    connstream = context.wrap_socket(newsocket, server_side=True)
    try:
        data = connstream.recv(1024)
        print('Received: {}'.format(data.decode('utf - 8')))
        connstream.sendall(b'Hello, client!')
    finally:
        connstream.shutdown(socket.SHUT_RDWR)
        connstream.close()

在上述代码中:

  1. 首先创建了一个 SSLContext 对象,并指定使用 TLSv1.2 协议。
  2. 然后加载服务器的证书和私钥。
  3. 创建一个普通的套接字,绑定到本地地址和端口 8443,并开始监听连接。
  4. 当有客户端连接时,使用 wrap_socket 方法将普通套接字包装成 SSL 套接字,实现加密通信。
  5. 接收客户端发送的数据,并回显一条消息。

客户端代码

import socket
import ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_verify_locations(cafile='ca.crt')

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(sock, server_hostname='127.0.0.1')
ssl_sock.connect(('127.0.0.1', 8443))

ssl_sock.sendall(b'Hello, server!')
data = ssl_sock.recv(1024)
print('Received: {}'.format(data.decode('utf - 8')))

ssl_sock.close()

在客户端代码中:

  1. 创建了 SSLContext 对象并指定使用 TLSv1.2 协议。
  2. 加载 CA 的根证书,用于验证服务器的证书。
  3. 创建普通套接字,并使用 wrap_socket 方法将其包装成 SSL 套接字。
  4. 连接到服务器,并发送一条消息,然后接收服务器的响应。

实际应用中的安全考虑

证书管理

  1. 证书更新:网站管理员需要定期检查证书的有效期,及时更新证书。可以使用自动化工具来监控证书的过期时间,并在证书即将过期时发出提醒。例如,使用 Certbot 工具,它可以自动申请和更新 Let's Encrypt 证书。
  2. 证书吊销:如果服务器的私钥泄露或者证书被误用,证书颁发机构可以吊销该证书。浏览器在验证证书时,会检查证书是否被吊销。常见的证书吊销检查方法有 CRL(证书吊销列表,Certificate Revocation List)和 OCSP(在线证书状态协议,Online Certificate Status Protocol)。

加密算法选择

  1. 选择强加密算法:随着计算机技术的发展,一些旧的加密算法可能会变得不安全。在配置 HTTPS 服务器时,应优先选择经过广泛验证和认可的强加密算法。例如,在 TLS 1.2 中,应优先使用 AES - 256 - GCM 等加密套件,它们提供了更好的安全性和性能。
  2. 避免使用弱算法:应避免使用诸如 DES(数据加密标准,Data Encryption Standard)等已经被证明存在安全漏洞的算法。同时,对于一些过时的密钥交换算法和 MAC 算法也应避免使用。

安全配置最佳实践

  1. 启用 HTTP/2:HTTP/2 不仅提高了性能,还在安全性方面有一些改进。它支持服务器推送、多路复用等功能,并且在传输层对数据进行了更有效的封装,减少了安全风险。许多现代的 Web 服务器都支持 HTTP/2,可以通过配置启用。
  2. 配置安全的 TLS 选项:在服务器配置中,应设置合适的 TLS 选项,如禁用不安全的协议版本(如 SSLv3)、设置合适的密码套件顺序等。例如,在 Nginx 服务器中,可以通过以下配置禁用 SSLv3:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
  1. 防范中间人攻击:除了通过证书验证来防范中间人攻击外,还可以使用 HSTS(HTTP 严格传输安全,HTTP Strict Transport Security)等机制。HSTS 可以告诉浏览器只通过 HTTPS 访问网站,即使在用户手动输入 HTTP 网址时,浏览器也会自动将其重定向到 HTTPS 版本,从而防止用户被诱骗到伪造的 HTTP 网站。

总结

HTTPS 在 Web 浏览器中的安全机制是一个复杂而又关键的领域。通过数字证书实现身份认证,使用对称加密和非对称加密进行数据加密和密钥交换,以及利用消息认证码保护数据完整性,为用户提供了一个安全的网络浏览环境。在实际应用中,合理的证书管理、正确的加密算法选择和安全配置最佳实践,对于确保 HTTPS 通信的安全性至关重要。希望通过本文的介绍和代码示例,读者能够对 HTTPS 在 Web 浏览器中的安全机制有更深入的理解,并在实际的后端开发和网络编程中应用这些知识,构建更安全的 Web 应用。