跳到主要内容

配置客户端和 APISIX Admin API 之间的 mTLS

双向 TLS (mTLS) 是一种双向 TLS,其中客户端和服务器相互验证身份。它通常用于防止未经授权的访问并加强安全性。

本文档将向你展示如何使用 Docker 化的 APISIX 配置客户端和 APISIX Admin API 之间的 mTLS。对于不同的部署方法,请相应调整步骤。

前置条件

  • 安装 Docker
  • 安装 cURL 以向服务发送请求进行验证。

生成证书和密钥

创建一个新目录并进入其中:

mkdir mtls-apisix-admin && cd mtls-apisix-admin

生成证书颁发机构 (CA) 密钥和证书:

openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 36500 -sha256 \
-key ca.key \
-out ca.crt \
-subj "/CN=ROOTCA" \
-extensions v3_ca \
-config <(printf "[req]\ndistinguished_name=req\n[ v3_ca ]\nbasicConstraints=critical,CA:TRUE\nkeyUsage=critical,keyCertSign,cRLSign\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid:always,issuer")

生成具有通用名称 admin.apisix.dev 的 APISIX Admin API 密钥和证书,并使用 CA 证书进行签名:

openssl genrsa -out admin_api.key 2048
openssl req -new -sha256 \
-key admin_api.key \
-out admin_api.csr \
-subj "/CN=test.com"

生成具有通用名称 CLIENT 的客户端密钥和证书,并使用 CA 证书进行签名:

openssl x509 -req -days 36500 -sha256 \
-in admin_api.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-out admin_api.crt \
-extensions v3_req \
-extfile <(printf "[v3_req]\nbasicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth")

为客户端生成密钥和证书签名请求( CSR) :

openssl genrsa -out client.key 2048
openssl req -new -sha256 \
-key client.key \
-out client.csr \
-subj "/CN=CLIENT"

用 CA 证书签名客户端 CSR 生成客户端证书 :

openssl x509 -req -days 36500 -sha256 \
-in client.csr \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-out client.crt \
-extensions v3_req \
-extfile <(printf "[v3_req]\nbasicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=clientAuth")

允许对目录中的文件进行读取访问,以避免下游权限问题:

chmod -R a+r ./

将证书和密钥复制到 /opt/mtls-client-apisix(或你选择的目录):

mkdir /opt/mtls-apisix-admin-api
cp ca.crt admin_api.key admin_api.crt client.key client.crt /opt/mtls-apisix-admin-api

配置 mTLS

你将在 Docker 容器中启动 APISIX,并带有 TLS 证书和密钥,以启用与客户端的 mTLS 通信。

为容器创建嵌入器网络 :

docker network create mtls-admin-net

启动等

在 Docker 启动一个等效服务器 :

docker run -d \
--name mtls-admin-etcd \
--network mtls-admin-net \
-e ALLOW_NONE_AUTHENTICATION=yes \
-e ETCD_ADVERTISE_CLIENT_URLS=http://mtls-admin-etcd:2379 \
-e ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 \
bitnamilegacy/etcd:3.5.7

启动 APISIX

/opt(或你选择的目录)中创建一个 APISIX 配置文件:

echo '
apisix:
ssl:
ssl_trusted_certificate: /usr/local/apisix/certs/ca.crt
deployment:
role: traditional
role_traditional:
config_provider: etcd
admin:
admin_key_required: true
allow_admin:
- 0.0.0.0/0
admin_key:
-
name: admin
key: Sup3rs3cretWr1teK3y # replace with your write key
role: admin
admin_listen:
ip: 0.0.0.0
port: 9180
https_admin: true
admin_api_mtls:
admin_ssl_cert: /usr/local/apisix/certs/admin_api.crt
admin_ssl_cert_key: /usr/local/apisix/certs/admin_api.key
admin_ssl_ca_cert: /usr/local/apisix/certs/ca.crt
etcd:
host:
- "http://mtls-admin-etcd:2379"
' > /opt/config.yaml

❶ 在 Docker 容器中设置可信任 CA 证书的路径 。

❷ 允许 Admin API 从您的测试客户端 IP 地址访问 。 将0.0.0.0/0替换为生产中更具限制性的CIDR范围。

❸ 设置Admin API 的监听地址 。

❹ 需要 TLS 访问 Admin API 。

❺ 在 Docker 容器中设置服务器 TLS 证书的路径 。

❻ 在 Docker 容器中设置服务器 TLS 密钥的路径 。

❼ 在 Docker 容器中设置 CA 证书的路径 。

在 Docker 中启动一个 APISIX 实例:

docker run -d \
--name mtls-admin-apisix \
--network mtls-admin-net \
-p 9180:9180 \
-v /opt/mtls-apisix-admin-api:/usr/local/apisix/certs \
-v /opt/config.yaml:/usr/local/apisix/conf/config.yaml \
apache/apisix:3.17.0-ubuntu

❶ 将主机上的 TLS 证书和密钥目录挂载到 Docker 容器。

❷ 将主机上的 APISIX 配置文件挂载到 Docker 容器。

验证 mTLS

要验证 APISIX 是否已启动且客户端和 APISIX Admin API 之间的 mTLS 已正确配置,请向 APISIX 发送请求以获取所有路由:

curl -ik --resolve "test.com:9180:127.0.0.1" "https://test.com:9180/apisix/admin/routes" \
--cert client.crt --key client.key \
-H "X-API-KEY: Sup3rs3cretWr1teK3y"

如果一切正常,你应该看到包含所有 APISIX 路由的 HTTP/1.1 200 OK 响应,例如:

{"list":[],"total":0}

如果您省略了客户端证书和密钥,请求中应当有类似400 Bad Request的响应失败 :

<html>
<head><title>400 No required SSL certificate was sent</title></head>
...