服务双向 TLS 配置

更新时间:
复制为 MD 格式

当您需要确保网关与后端服务之间的通信安全,并且双方都要验证对方身份时,可以使用双向认证(mTLS)功能。本文将详细介绍双向认证的工作原理,以及如何在网关控制台完成相关配置。

双向 TLS 认证介绍

双向认证是一种安全通信机制,要求通信双方互相验证身份。与普通的 HTTPS 连接不同,双向认证中不仅网关要验证后端服务的身份,后端服务也要验证网关的身份。只有当双方都通过验证后,才能建立加密通信通道。

这种机制适用于对安全性要求较高的服务间通信场景,当网关与后端服务建立连接时,整个过程分为三个阶段:

  1. 证书交换:后端服务将服务端证书发送给网关,网关验证其真实性;然后网关将客户端证书发送给后端服务,后端服务验证其身份。

  2. 密钥协商:双方使用对方的公钥加密传输密钥材料,各自独立计算出相同的会话密钥。

  3. 建立加密通道:双方使用会话密钥加密后续的所有数据传输。

配置前的准备工作

配置双向认证需要准备三类证书:

  • 网关客户端证书(client.crt):证明网关的身份,需上传到网关控制台证书 ID字段。

  • 根证书(ca.crt):用于验证后端服务的证书,需填入CA 证书字段,同时配置到后端服务。

  • 后端服务端证书(server.crt):证明后端服务的身份,需配置到后端服务(如 Nginx)。

测试环境可参考附录生成自签名证书。

注意:网关和后端服务必须使用同一套根证书体系,否则无法互相验证身份。

在网关控制台配置双向认证

准备工作完成后,您可以登录网关控制台开始配置。进入创建服务的页面后,请按照以下步骤填写表单:

配置项

填写说明

服务来源

选择 DNS 域名,表示后端服务通过域名方式访问

服务名称

填写有意义的名称(如订单服务),支持小写字母、数字和短横线,不超过 64 个字符

服务地址

格式为域名加冒号加端口,例如 api.example.com:443;如使用非标准端口请填写实际端口号

TLS 模式

选择双向 TLS (mTLS)

证书 ID

选择已上传的网关客户端证书(client.crt);如下拉列表为空,需先点击上传证书,粘贴证书内容(PEM 格式,以 BEGIN CERTIFICATE 开头、END CERTIFICATE 结尾)

CA 证书

粘贴根证书内容(ca.crt),用于验证后端服务返回的证书;同样为 PEM 格式,确保证书内容完整包含开头和结尾标记

服务名称标识 (SNI)

如后端服务需要指定域名访问则填写

填写完成后,检查各项信息准确无误,点击确定按钮保存服务配置。

后端服务的配合配置

网关端的配置完成后,还需要后端服务进行相应的配置,才能正常建立双向认证连接。这部分配置通常需要运维团队协助完成。

以后端服务使用 Nginx 作为反向代理为例,需要在 Nginx 的配置文件中开启客户端证书验证功能。具体来说,需要在 server 配置块中添加以下配置:

server {
    listen 443 ssl;
    server_name api.example.com;

    # 服务端证书
    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;

    # 开启客户端证书验证(关键配置)
    ssl_verify_client on;
    ssl_client_certificate /etc/nginx/ssl/ca.crt;

    location / {
        proxy_pass http://localhost:8080;
    }
}

其中 ssl_verify_client on 表示强制要求所有连接到该服务的客户端必须提供有效的客户端证书。ssl_client_certificate 指定了用于验证客户端证书的 CA 证书文件路径,这个 CA 证书文件应该包含签发网关客户端证书的根证书内容。

配置修改完成后,需要重启 Nginx 服务使配置生效。

验证配置是否成功

配置完成后可通过以下方式验证:

控制台测试:创建路由并发送测试请求。如返回正常响应则配置成功;如返回 400、403 或 SSL 错误,请检查证书配置。

命令行测试

curl --cert client.crt --key client.key https://api.example.com/test

能正常返回数据说明配置正确。如不带证书访问被拒绝,也表明双向认证已生效。

同时可在后端服务侧查看访问日志,确认请求是否到达。如出现 SSL 握手失败,请检查后端的 CA 证书配置是否与网关客户端证书匹配。

附录:测试环境证书生成方法

如果您只是在测试环境中验证功能,可以按照以下步骤生成自签名证书。这些命令需要在安装了 OpenSSL 的 Linux 或 macOS 系统中执行。

首先生成根证书的私钥文件,执行以下命令:

openssl genrsa -out ca.key 2048

这会生成一个 2048 位的 RSA 私钥,保存在 ca.key 文件中。

然后使用这个私钥创建自签名的根证书:

openssl req -new -x509 -key ca.key -out ca.crt -days 3650 \
  -subj "/C=CN/O=Test/CN=RootCA"

days 参数指定证书有效期为 3650 天。执行过程中会提示输入一些证书信息,包括国家、组织、常用名等,您可以根据实际情况填写,测试环境下使用默认值也可以。

接下来生成后端服务使用的服务端证书。先生成私钥:

openssl genrsa -out server.key 2048

然后创建证书签名请求,这里需要注意,Common Name 字段应该填写后端服务的实际域名,因为这是证书用于标识的身份信息:

openssl req -new -key server.key -out server.csr \
  -subj "/C=CN/O=Test/CN=api.example.com"

注意:CN 要改成自己的域名。

最后使用根证书签发服务端证书:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out server.crt -days 3650

同理,为网关生成客户端证书。生成私钥:

openssl genrsa -out client.key 2048

创建签名请求:

openssl req -new -key client.key -out client.csr \
  -subj "/C=CN/O=Test/CN=Gateway"

然后签发证书:

openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out client.crt -days 3650

完成这些步骤后,您会得到 ca.crt、server.crt 和 client.crt 三份证书文件。各证书的使用位置如下:

证书

使用位置

用途

client.crt + client.key

上传到数字证书管理,配置到网关 Service 的证书 ID字段

网关向后端服务证明自身身份

ca.crt

填入到网关 Service 的CA 证书字段,同时配置到后端服务的 ssl_client_certificate 路径(Nginx 场景)

网关验证后端服务证书是否可信

server.crt + server.key

配置到后端服务(Nginx 的 ssl_certificate)

证明后端服务身份

按以上方式配置后,测试环境的双向认证即可正常工作。