面向开发人员的 HTTPS

2025-06-07

面向开发人员的 HTTPS

本文位于:

简介

以下是针对开发者的 HTTPS的简单介绍。🔒

本文摘自FastAPI 文档中有关 HTTPS 的内容

我刚刚用一些解释和图表升级了这些文档,我认为最终结果是通用的,并且足够有用,可以让许多其他开发人员(甚至使用其他语言框架的开发人员)也可以将其发布为一篇文章,所以就在这里。🤓

这是给谁的

如果您是用户,您与 HTTPS 的唯一交互是通过浏览器打开 URL,那么您最好只阅读HTTPS 的工作原理

如果您是密码学研究人员,最好研究密码原语,然后阅读标准(RFC)。

但是,如果您是一名开发人员(程序员、编码员),并且想了解足够的技术细节,以了解其工作原理以及如何在应用程序中使用 HTTPS,而无需深入了解密码学和 Web 标准,那么这篇文章就是为您准备的!🎉👇

关于 HTTPS

人们很容易认为 HTTPS 只是“启用”或“未启用”而已。

但实际情况比这复杂得多。

要从消费者角度了解HTTPS 的基础知识,请查看https://howhttps.works/

现在,从开发人员的角度来看,在考虑 HTTPS 时需要考虑以下几点:

  • 对于HTTPS,服务器需要有第三方生成的“证书”
    • 这些证书实际上是从第三方获得的,而不是“生成的”。
  • 证书有有效期
    • 它们会过期
    • 然后它们需要被更新,并从第三方再次获得。
  • 连接的加密发生在TCP 级别
    • 这是HTTP 下面的一层
    • 因此,证书和加密处理在 HTTP 之前完成
  • TCP 不知道“域”是什么,只知道 IP 地址。
    • 有关所请求的特定域的信息位于HTTP 数据中。
  • HTTPS 证书认证”了某个,但协议和加密发生在 TCP 级别,然后才知道正在处理哪个域。
  • 默认情况下,这意味着每个 IP 地址只能拥有一个 HTTPS 证书
    • 无论您的服务器有多大,或者其上的每个应用程序有多小。
    • 然而,这个问题有一个解决办法。
  • TLS协议(在 HTTP 之前处理 TCP 级别的加密的协议)有一个扩展,称为SNI
    • 此 SNI 扩展允许单个服务器(具有单个 IP 地址)拥有多个 HTTPS 证书为多个 HTTPS 域/应用程序提供服务。
    • 为了使其正常工作,在服务器上运行、监听公共 IP 地址的单个组件(程序)必须拥有服务器中的所有 HTTPS 证书。
  • 获得安全连接后,通信协议仍然是 HTTP
    • 尽管内容是通过HTTP 协议发送的,但它们也是加密的

通常的做法是在服务器(机器、主机等)上运行一个程序/HTTP 服务器,并管理所有 HTTPS 部分:接收加密的 HTTPS 请求,将解密的 HTTP 请求发送到在同一服务器中运行的实际 HTTP 应用程序(在本例中为FastAPI应用程序),从应用程序获取HTTP 响应,使用适当的HTTPS 证书对其进行加密,然后使用HTTPS将其发送回客户端。该服务器通常称为TLS 终止代理

可以用作 TLS 终止代理的一些选项包括:

  • Traefik(也可以处理证书更新)
  • Caddy(也可以处理证书更新)
  • Nginx
  • HAProxy

让我们加密

在 Let's Encrypt 之前,这些HTTPS 证书由受信任的第三方出售。

获取这些证书的过程曾经很繁琐,需要大量的文书工作,而且证书价格相当昂贵。

但后来Let's Encrypt诞生了。

这是 Linux 基金会的一个项目,它以自动化的方式免费提供 HTTPS 证书。这些证书使用所有标准加密安全性,并且有效期较短(约 3 个月),因此由于有效期较短,安全性实际上更高。

域名经过安全验证,证书自动生成。这还可以自动更新这些证书。

这个想法是自动获取和更新这些证书,以便您可以永久免费地拥有安全的 HTTPS

面向开发人员的 HTTPS 示例

下面是 HTTPS API 的逐步示例,主要关注对开发人员重要的想法。

域名

一切可能都始于你获取一个域名。然后,你将在 DNS 服务器(可能是同一个云提供商)中配置它。

您可能会获得一个云服务器(虚拟机)或类似的东西,并且它会有一个固定的 公共 IP 地址

在 DNS 服务器中,您需要配置一条记录(“ A record”)以将您的域指向服务器的公共IP 地址

在第一次设置所有东西时,您可能只会执行一次此操作。

提示:此域名部分远早于 HTTPS,但由于一切都取决于域和 IP 地址,因此值得在此提一下。

DNS

现在让我们关注所有实际的 HTTPS 部分。

首先,浏览器会向DNS 服务器检查域名的 IP是什么,在本例中为someapp.example.com

DNS 服务器会告诉浏览器使用某个特定的IP 地址。该 IP 地址是您在 DNS 服务器中配置的服务器使用的公网 IP 地址。

TLS 握手开始

然后浏览器将通过端口 443(HTTPS 端口)与该 IP 地址进行通信。

通信的第一部分只是建立客户端和服务器之间的连接并决定他们将使用的加密密钥等。

客户端和服务器之间建立 TLS 连接的交互称为TLS 握手

带有 SNI 扩展的 TLS

服务器中只能有一个进程监听特定IP 地址上的特定端口。同一 IP 地址上可以有其他进程监听其他端口,但每个 IP 地址和端口组合只能有一个进程监听。

443TLS(HTTPS)默认使用特定端口。所以这就是我们需要的端口。

由于只有一个进程可以监听此端口,因此执行此操作的进程将是TLS 终止代理

TLS 终止代理可以访问一个或多个TLS 证书(HTTPS 证书)。

使用上面讨论的SNI 扩展,TLS 终止代理将检查应该为该连接使用哪个可用的 TLS(HTTPS)证书,并使用与客户端期望的域匹配的证书。

在这种情况下,它将使用证书someapp.example.com

客户端已经信任生成该 TLS 证书的实体(在本例中为 Let's Encrypt,但我们稍后会看到),因此它可以验证该证书是否有效。

然后,客户端和 TLS 终止代理使用该证书,决定如何加密剩余的TCP 通信。这样就完成了TLS 握手部分。

此后,客户端和服务器之间会建立一条加密的 TCP 连接,这就是 TLS 提供的。然后,客户端和服务器可以使用该连接启动实际的HTTP 通信

这就是HTTPS,它只是安全 TLS 连接内的普通HTTP,而不是纯粹的(未加密的)TCP 连接。

提示:请注意,通信的加密发生在TCP 级别,而不是 HTTP 级别。

HTTPS 请求

现在客户端和服务器(具体来说是浏览器和 TLS 终止代理)已经有了加密的 TCP 连接,它们可以开始HTTP 通信

因此,客户端发送一个HTTPS 请求。这只是一个通过加密的 TLS 连接的 HTTP 请求。

解密请求

TLS 终止代理将使用约定的加密来解密请求,并将纯文本(解密后的)HTTP 请求传输到运行应用程序的进程(例如,使用 Uvicorn 运行 FastAPI 应用程序的进程)。

HTTP 响应

应用程序将处理请求并向TLS 终止代理发送纯文本(未加密)的 HTTP 响应。

HTTPS 响应

然后,TLS 终止代理将使用之前商定的加密技术(从的证书开始)对响应进行加密someapp.example.com,并将其发送回浏览器。

接下来,浏览器将验证响应是否有效并使用正确的加密密钥加密等。然后它将解密响应并进行处理。

客户端(浏览器)将知道响应来自正确的服务器,因为它使用的是他们之前使用HTTPS 证书同意的加密技术。

多种应用

在同一台服务器(或多台服务器)中,可能有多个应用程序,例如其他 API 程序或数据库。

只有一个进程可以处理特定的 IP 和端口(我们示例中的 TLS 终止代理),但其他应用程序/进程也可以在服务器上运行,只要它们不尝试使用相同的公共 IP 和端口组合

这样,TLS 终止代理可以处理多个域、多个应用程序的 HTTPS 和证书,然后在每种情况下将请求传输到正确的应用程序。

证书续订

在未来的某个时间点,每个证书都会过期(获得证书后约 3 个月)。

然后,会有另一个程序(在某些情况下是另一个程序,在某些情况下可能是相同的 TLS 终止代理)与 Let's Encrypt 对话并更新证书。

TLS证书与域名相关联而不是与 IP 地址相关联。

因此,要更新证书,更新程序需要向权威机构(Let's Encrypt)证明它确实“拥有”并控制该域

为了实现这一点,并满足不同的应用需求,它有几种方法可以实现。一些常用的方法如下:

  • 修改一些DNS记录
    • 为此,续订程序需要支持 DNS 提供商的 API,因此,根据您使用的 DNS 提供商,这可能是或可能不是一个选项。
  • 在与域关联的公共 IP 地址上作为服务器运行(至少在证书获取过程中)。
    • 正如我们上面所说,只有一个进程可以监听特定的 IP 和端口。
    • 这就是为什么当相同的 TLS 终止代理也负责证书更新过程时它非常有用的原因之一。
    • 否则,您可能需要暂时停止 TLS 终止代理,启动续订程序以获取证书,然后使用 TLS 终止代理配置证书,最后重新启动 TLS 终止代理。这并不理想,因为在 TLS 终止代理关闭期间,您的应用将不可用。

所有这些更新过程在仍然为应用程序提供服务的同时,也是您希望拥有一个单独的系统来使用 TLS 终止代理处理 HTTPS,而不是直接在应用程序服务器上使用 TLS 证书(例如 Uvicorn)的主要原因之一。

回顾

拥有HTTPS非常重要,在大多数情况下都至关重要。作为开发人员,你在 HTTPS 方面需要投入的大部分精力都在于理解这些概念及其工作原理。

但是,一旦您了解了开发人员的 HTTPS基本信息,您就可以轻松地组合和配置不同的工具,以帮助您以简单的方式管理一切。

了解更多

本文摘自FastAPI 文档中有关部署和 HTTPS 的内容

如果您想了解一些可以使用的工具的具体示例以及如何配置它们来部署 FastAPI 应用程序,请查看FastAPI 文档中的后续章节。

关于我

嘿! 👋 我是塞巴斯蒂安·拉米雷斯 ( tiangolo )。

您可以关注我、联系我、了解我所做的事情,或者使用我的开源代码:

文章来源:https://dev.to/tiangolo/https-for-developers-1774
PREV
Node.js + PostgreSQL:CRUD 示例
NEXT
对 UI 持乐观态度