跳到主要内容
版本:3.9.x

在 API7 企业版和上游之间配置 mTLS

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

本指南将引导你了解如何在 API7 网关和上游服务之间配置 mTLS,使用 NGINX 作为示例上游服务。

前置条件

生成证书和密钥

  1. 生成证书颁发机构 (CA) 的密钥和证书。

    openssl genrsa -out ca.key 2048
    openssl req -x509 -new -nodes -key ca.key -sha256 -days 36500 -out ca.crt \
    -subj "/CN=ROOTCA"
  2. 为上游服务(NGINX)生成通用名称(Common Name)为 test.com 的服务器密钥和证书,并使用 CA 证书进行签名。

    openssl genrsa -out server.key 2048 && \
    openssl req -new -key server.key -out server.csr -subj "/CN=test.com" && \
    cat > server.ext << EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = test.com
    EOF
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
    -CAcreateserial -out server.crt -days 36500 \
    -sha256 -extfile server.ext
  3. 为 API7 网关(作为客户端)生成通用名称(Common Name)为 client 的密钥和证书,并使用 CA 证书进行签名。

    openssl genrsa -out client.key 2048 && \
    openssl req -new -key client.key -out client.csr -subj "/CN=client" && \
    cat > client.ext << EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = clientAuth
    EOF
    openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 36500 -sha256 -extfile client.ext
  4. 生成证书和密钥后,检查你的目录以找到 client.crtclient.keyca.crt

配置上游服务

启动一个 NGINX 服务器作为示例上游服务:

docker run -d \
--name quickstart-nginx \
--network=host \
nginx

将 CA 证书、服务器证书公钥和私钥复制到 NGINX 容器中:

docker cp ca.crt quickstart-nginx:/var/ca.crt
docker cp server.crt quickstart-nginx:/var/server.crt
docker cp server.key quickstart-nginx:/var/server.key

在 NGINX 配置文件中配置一个监听在 /hello 路径和 8443 端口上的 HTTPS 服务器:

/etc/nginx/nginx.conf
http {
# ...
server {
listen 8443 ssl;
server_name test.com;
ssl_certificate /var/server.crt;
ssl_certificate_key /var/server.key;
ssl_client_certificate /var/ca.crt;
ssl_verify_client on;
location /hello {
return 200 "Hello API7!";
}
}
}

server_name:设置为 test.com 以与服务器证书的 CN 值保持一致。

ssl_certificate:配置服务器证书公钥 server.crt 的路径。

ssl_certificate_key:配置服务器证书私钥 server.key 的路径。

ssl_client_certificate:配置 CA 证书公钥 ca.crt 的路径。

ssl_verify_client:设置为 on 以验证客户端证书。

重新加载 NGINX 服务器以应用配置更改:

docker exec quickstart-nginx nginx -s reload

要验证 NGINX 实例是否配置正确,请使用客户端证书和密钥向上游路由发送请求:

curl -ik "https://127.0.0.1:8443/hello" --cert client.crt --key client.key

你应该会收到 HTTP/1.1 200 OK 响应。

为 API7 企业版配置 mTLS

创建路由至 NGINX 服务器

  1. 从侧边导航栏的网关组下选择 已发布服务,然后点击 新增服务
  2. 选择 手动新增
  3. 在弹出的对话框中,执行以下操作:
    • 服务基本信息名称 字段中,输入 mtls-nginx
    • 服务类型字段中,选择 HTTP (Layer 7 Proxy)
    • 上游基本信息名称 字段中,输入 default
    • 如何找到上游字段中,选择 Use Nodes(使用节点)
    • 点击 新增节点
    • 新增节点 对话框中,执行以下操作:
      • 主机 字段中,输入你的 API7 控制台(dashboard)的 IP 地址。
      • 端口 字段中,输入 8443
      • 权重 字段中,输入 100
    • 连接配置 字段中,选择 HTTPs。将 客户端证书CA 证书 字段留空以备后续步骤配置。
    • 打开 新增第一条路由 开关,然后创建一个路径为 /hello,方法为 GET 的路由。
    • 点击 新增

配置证书

如果你希望引用来自密钥管理提供商的 SSL 证书,请参阅引用 HashiCorp Vault 中的密钥引用 AWS Secrets Manager 中的密钥引用 Kubernetes Secret 中的密钥

上传证书

  1. 从侧边导航栏选择你的网关组下的 证书,进入 SSL 证书 选项卡。
  2. 点击 Add SSL Certificate(添加 SSL 证书)
  3. 在弹出的对话框中,执行以下操作:
  • 名称字段中,输入 Upstream SSL Certificate
  • 证书字段中,上传 client.crt 文件。
  • 私钥字段中,上传 client.key 文件。
  • 点击 新增
  1. 从侧边导航栏选择你的网关组下的 证书,然后点击 CA 证书选项卡。
  2. 点击 添加 CA 证书
  3. 在弹出的对话框中,执行以下操作:
  • 名称字段中,输入 Upstream CA Certificate
  • 证书字段中,上传 ca.crt 文件。
  • 点击 新增

配置证书

  1. 从侧边导航栏选择你的网关组下的 已发布服务,进入你之前创建的 mtls-nginx 服务。
  2. 从侧边导航栏选择 上游
  3. 点击 连接配置 区域的编辑按钮。
  4. 在弹出的对话框中,执行以下操作:
  • 客户端证书字段中,选择 Upstream SSL Certificate
  • CA 证书字段中,选择 Upstream CA Certificate
  • 点击 保存

验证 API7 企业版与上游服务之间的 mTLS

向路由发送请求:

curl -ik "http://127.0.0.1:9080/hello"

你应该会收到 HTTP/1.1 200 OK 响应,这证明 API7 企业版与上游服务之间的 mTLS 已经配置成功。

额外资源