跳到主要内容

SSL 证书

本文档将介绍 APISIX 中 SSL 证书对象的基本概念以及可能需要它们的场景,包括配置客户端应用程序、APISIX 和上游服务器之间的 TLS 或 mTLS。开头将回顾 SSL/TLS 的基础知识,以帮助你进一步了解何时在 APISIX 中使用 SSL 证书对象。

在文档末尾探索其他资源,以获取有关相关主题的更多信息。

概述

TLS (传输层安全性协议) 是 SSL (安全套接层) 协议的后继者,是一种旨在保护两方(例如 Web 浏览器和 Web 服务器)之间通信的加密协议。它在现有协议(例如 HTTP 或 TCP)之上实现,通过 TLS 握手建立连接并加密数据传输,提供额外的安全层。

以下是 TLS v1.2TLS v1.3(两种最常用的 TLS 版本)中单向 TLS 握手的高级概述:

TLS Handshake for TLS v1.2 and TLS v1.3

在此过程中,服务器通过出示其证书向客户端验证自己的身份。客户端验证证书以确保证书有效且由受信任的机构签发。证书验证通过后,客户端和服务器协商一个共享密钥,用于加密和解密应用程序数据。

APISIX 还支持 双向 TLSmTLS,其中客户端也通过出示其证书向服务器验证自己的身份,从而有效地创建双向 TLS 连接。这确保了双方都经过身份验证,并有助于防止中间人攻击等网络攻击。

要在使用 APISIX 的系统中启用 TLS 或 mTLS,你应该在适当的位置生成和配置证书,例如在客户端应用程序、APISIX 和/或上游服务器上。对于 APISIX 端的配置,可能需要 SSL 证书对象,具体取决于你要保护的通信部分:

TLSmTLS
客户端应用程序—APISIX必需必需
APISIX—上游不需要可选

你将了解这些场景中 SSL 对象的使用案例和非使用案例。

客户端应用程序和 APISIX 之间的 TLS

强制在客户端应用程序和 APISIX 之间使用 TLS 是常见的做法,因为此段的数据传输通常通过公共互联网进行,因此被窃听的风险较高。

下图说明了在客户端应用程序和 APISIX 之间通过 HTTP 实现 TLS(也称为 HTTPS)时 SSL 对象的用法,其中 APISIX 部署在域名 foodservice.com 后的任意 IP 地址 132.69.xxx.xxx 处,充当公共流量和内部服务之间的守门人:


Example of TLS between Client Applications and APISIX


以下是插图中发生的关键步骤:

  1. 客户端应用程序向 https://foodservice.com 发起请求。

  2. 请求首先通过 DNS 服务器,DNS 服务器将域名解析为 IP 地址并将 IP 地址返回给客户端应用程序。

  3. 客户端应用程序将对 foodservice.com 的请求发送到其解析的 IP 地址,在此过程中,客户端应用程序与 APISIX 执行 TLS 握手,APISIX 将其证书 server.crt 发送给客户端进行身份验证。

  4. 由于 foodservice.com 包含在 APISIX SSL 对象的 SNI 列表中,TLS 握手将成功。客户端应用程序和 APISIX 之间的通信现在已通过 TLS 加密。

  5. APISIX 通过 HTTP 将请求路由并转发到相应的上游服务。请注意,在此示例中,上游服务暴露在默认端口 80 上,TLS 在 APISIX 处终止。

有关如何配置客户端和 APISIX 之间 HTTPS 的详细说明,请参阅操作指南

APISIX 和上游之间的 TLS

在 API 网关和上游之间的流量不安全或非私有的情况下,上游服务可能需要 TLS。在 APISIX 和上游之间的单向 TLS 设置中,上游服务器负责出示证书和密钥。在 APISIX 方面,你只需配置 上游 使用 HTTPS 方案和端口 443(或其他指定端口)。

有关如何配置 APISIX 和上游之间 TLS 的详细说明,请参阅操作指南

客户端应用程序和 APISIX 之间的 mTLS

在限制对后端服务的一般访问的封闭系统中,服务器验证客户端的身份非常重要,以确保只允许经过身份验证和授权的客户端访问后端服务。实现此目的的一种方法是在客户端和服务器之间配置 mTLS。使用 mTLS,客户端在 TLS 握手过程中向服务器出示证书,服务器使用证书验证客户端的身份。如果客户端未通过身份验证,服务器将拒绝请求。

要配置客户端应用程序和 APISIX 之间的 mTLS,除了 TLS 所需的配置外,你还应该:

  1. 在客户端应用程序上生成并配置证书和密钥。

  2. 证书颁发机构 (CA) 证书添加到 APISIX SSL 对象的 client.ca 字段中,如下所示:

    {   
    "type": "server",
    "sni": "foodservice.com",
    "cert": "<content of server.crt>",
    "key": "<content of server.key>",
    "client": {
    "ca": "<content of ca.crt>"
    }
    }

    其中 CA 证书用于验证 CA 签发的客户端证书上的数字签名,从而验证客户端应用程序的身份。

有关如何配置客户端和 APISIX 之间 mTLS 的详细说明,请参阅操作指南

APISIX 和上游之间的 mTLS

API 网关及其上游服务之间的 mTLS 通常由需要在高安全性环境中保持符合相关安全标准和法规的组织(例如金融机构)实施。

在 APISIX 中,配置 APISIX 及其上游服务之间的 mTLS 时是否使用 SSL 对象取决于配置是否重复。

如果证书仅对一个域有效,你可以选择直接在上游对象中配置证书和密钥:

Example of mTLS between APISIX and Upstreams without SSL object

当证书(例如通配符证书)对多个域有效时,建议创建一个 SSL 对象来存储证书和密钥,避免在上游进行重复的 TLS 配置:


Example of mTLS between APISIX and Upstreams with SSL object

有关如何配置 APISIX 和上游之间 mTLS 的说明,请参阅操作指南

其他资源