SSL 证书
本文档将介绍 APISIX 中 SSL 证书对象的基本概念以及可能需要它们的场景,包括配置客户端应用程序、APISIX 和上游服务器之间的 TLS 或 mTLS。开头将回顾 SSL/TLS 的基础知识,以帮助你进一步了解何时在 APISIX 中使用 SSL 证书对象。
在文档末尾探索其他资源,以获取有关相关主题的更多信息。
概述
TLS (传输层安全性协议) 是 SSL (安全套接层) 协议的后继者,是一种旨在保护两方(例如 Web 浏览器和 Web 服务器)之间通信的加密协议。它在现有协议(例如 HTTP 或 TCP)之上实现,通过 TLS 握手建立连接并加密数据传输,提供额外的安全层。
以下是 TLS v1.2 和 TLS v1.3(两种最常用的 TLS 版本)中单向 TLS 握手的高级概述:
在此过程中,服务器通过出示其证书向客户端验证自己的身份。客户端验证证书以确保证书有效且由受信任的机构签发。证书验证通过后,客户端和服务器协商一个共享密钥,用于加密和解密应用程序数据。
APISIX 还支持 双向 TLS 或 mTLS,其中客户端也通过出示其证书向服务器验证自己的身份,从而有效地创建双向 TLS 连接。这确保了双方都经过身份验证,并有助于防止中间人攻击等网络攻击。
要在使用 APISIX 的系统中启用 TLS 或 mTLS,你应该在适当的位置生成和配置证书,例如在客户端应用程序、APISIX 和/或上游服务器上。对于 APISIX 端的配置,可能需要 SSL 证书对象,具体取决于你要保护的通信部分:
| TLS | mTLS | |
|---|---|---|
| 客户端应用程序—APISIX | 必需 | 必需 |
| APISIX—上游 | 不需要 | 可选 |
你将了解这些场景中 SSL 对象的使用案例和非使用案例。
客户端应用程序和 APISIX 之间的 TLS
强制在客户端应用程序和 APISIX 之间使用 TLS 是常见的做法,因为此段的数据传输通常通过公共互联网进行,因此被窃 听的风险较高。
下图说明了在客户端应用程序和 APISIX 之间通过 HTTP 实现 TLS(也称为 HTTPS)时 SSL 对象的用法,其中 APISIX 部署在域名 foodservice.com 后的任意 IP 地址 132.69.xxx.xxx 处,充当公共流量和内部服务之间的守门人:
以下是插图中发生的关键步骤:
-
客户端应用程序向
https://foodservice.com发起请求。 -
请求首先通过 DNS 服务器,DNS 服务器将域名解析为 IP 地址并将 IP 地址返回给客户端应用程序。
-
客户端应用程序将对
foodservice.com的请求发送到其解析的 IP 地址,在此过程中,客户端应用程序与 APISIX 执行 TLS 握手,APISIX 将其证书server.crt发送给客户端进行身份验证。 -
由于
foodservice.com包含在 APISIX SSL 对象的 SNI 列表中,TLS 握手将成功。客户端应用程序和 APISIX 之间的通信现在已通过 TLS 加密。 -
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 所需的配置外,你还应该:
-
在客户端应用程序上生成并配置证书和密钥。
-
将 证书颁发机构 (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 对象取决于配置是否重复。
如果证书仅对一个域有效,你可以选择直接在上游对象中配置证书和密钥:
当证书(例如通配符证书)对多个域有效时,建议创建一个 SSL 对象来存储证书和密钥,避免在上游进行重复的 TLS 配置:
有关如何配置 APISIX 和上游之间 mTLS 的说明,请参阅操作指南。