配置客户端与 API7 网关之间的 mTLS
双向传输层安全性(mTLS),作为 TLS(传输层安全性)的一种高级应用,旨在通过客户端与服务器之间的双向身份验证机制,显著提升通信安全性。这一过程依赖于精心设计的握手流程,双方不仅交换加密密钥,还相互验证对方的数字证书,从而确保通信双方身份的准确无误。
本指南将阐述如何在客户端应用程序和 API7 企业版之间配置 mTLS,以有效阻止未经授权的访问并加固整体安全防线。
下面是一个互动演示,提供配置 mTLS 的实践入门。通过点击并按照步骤操作,你将更好地了解如何在 API7 企业版中使用。
前提条件
生成证书和密钥
生成证书颁发机构(CA)的密钥和证书。
openssl genrsa -out ca.key 2048 && \
openssl req -new -sha256 -key ca.key -out ca.csr -subj "/CN=ROOTCA" && \
openssl x509 -req -days 36500 -sha256 -extensions v3_ca -signkey ca.key -in ca.csr -out ca.crt为 API7 企业版生成一个公用名为
test.com
的密钥和证书,并使用 CA 证书签名。openssl genrsa -out server.key 2048 && \
openssl req -new -sha256 -key server.key -out server.csr -subj "/CN=test.com" && \
openssl x509 -req -days 36500 -sha256 -extensions v3_req \
-CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial \
-in server.csr -out server.crt为客户端生成一个公用名为
CLIENT
的密钥和证书,并使用 CA 证书签名。openssl genrsa -out client.key 2048 && \
openssl req -new -sha256 -key client.key -out client.csr -subj "/CN=CLIENT" && \
openssl x509 -req -days 36500 -sha256 -extensions v3_req \
-CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial \
-in client.csr -out client.crt生成证书和密钥后,检查并确保以下文件已保存至你的本地设备。
❶
server.crt
: 服务器证书❷
server.key
: 服务器证书的密钥❸
ca.crt
: CA 证书
为 API7 企业版配置 mTLS
从侧边栏选择网关组的 SSL 证书,然后点击 + 新增 SSL 证书。
在对话框中,执行以下操作:
- 类型 选择
服务器
。 - 选择 上传 方法。
- 在 证书 字段中上传
server.crt
文件。 - 在 私钥 字段中上传
server.key
文件。 - 打开 对等验证 按钮。
- 在 CA 证书(可选) 字段中上传
ca.crt
文件。 - 点击 新增。
- 添加完成后,可以在 SSL 证书列表中看到一个新条目,包含一个唯一的 ID 和
test.com
作为其服务名称指示符(SNIS)。
验证客户端与 API7 网关之间的 mTLS 连接
使用客户端证书进行请求
由于已配置的 SSL 证书针对公用名(CN)test.com
,因此请确保在测试或生产环境中,使用 test.com
作为 API7 网关中服务的访问域名。
使用客户端证书发送请求至 https://test.com:9443/ip
,并将 test.com
解析为 127.0.0.1
。
curl -ikv --resolve "test.com:9443:127.0.0.1" "https://test.com:9443/ip" \
--cert client.crt --key client.key
可以看到类似以下内容的响应,说明客户端与 API7 网关之间已启用 mTLS。
* Added test.com:9443:127.0.0.1 to DNS cache
* Hostname test.com was found in DNS cache
* Trying 127.0.0.1:9443...
* Connected to test.com (127.0.0.1) port 9443
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
# highlight-start
* (304) (IN), TLS handshake, Request CERT (13):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Certificate (11):
* (304) (OUT), TLS handshake, CERT verify (15):
* (304) (OUT), TLS handshake, Finished (20):
# highlight-end
* SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384 / [blank] / UNDEF
* ALPN: server accepted h2
* Server certificate:
* subject: CN=test.com
* start date: Jul 31 08:50:42 2024 GMT
* expire date: Jul 7 08:50:42 2124 GMT
* issuer: CN=ROOTCA
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://test.com:9443/ip
* [HTTP/2] [1] [:method: GET]
* [HTTP/2] [1] [:scheme: https]
* [HTTP/2] [1] [:authority: test.com:9443]
* [HTTP/2] [1] [:path: /ip]
* [HTTP/2] [1] [user-agent: curl/8.6.0]
* [HTTP/2] [1] [accept: */*]
> GET /ip HTTP/2
> Host: test.com:9443
> User-Agent: curl/8.6.0
> Accept: */*
>
# highlight-start
< HTTP/2 200
HTTP/2 200
# highlight-end
...
注意,在握手期间,API7 网关和客户端成功验证了彼此的证书并建立了连接。
无客户端证书情况下进行请求
在无客户端证书的情况下,发送请求到 https://test.com:9443/ip
。
curl -ikv --resolve "test.com:9443:127.0.0.1" "https://test.com:9443/ip"
可以看到类似以下内容的响应,说明客户端与 API7 网关之间 mTLS 握手失败。
* Added test.com:9443:127.0.0.1 to DNS cache
* Hostname test.com was found in DNS cache
* Trying 127.0.0.1:9443...
* Connected to test.com (127.0.0.1) port 9443
* ALPN: curl offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
# highlight-start
* (304) (IN), TLS handshake, Request CERT (13):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Certificate (11):
* (304) (OUT), TLS handshake, Finished (20):
# highlight-end
* SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384 / [blank] / UNDEF
* ALPN: server accepted h2
* Server certificate:
* subject: CN=test.com
* start date: Jul 31 08:50:42 2024 GMT
* expire date: Jul 7 08:50:42 2124 GMT
* issuer: CN=ROOTCA
# highlight-start
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
# highlight-end
* using HTTP/2
* [HTTP/2] [1] OPENED stream for https://test.com:9443
相关阅读
- 核心概念
- 快速入门