用户为API网关配置双向SSL证书认证需要同时验证客户端和服务器的证书,确保通信双方的身份合法性。下面我写一下详细的配置步骤:

1. 生成证书(示例使用OpenSSL)

1.1 生成CA证书(用于签名)

bash

复制

下载

生成CA私钥

openssl genrsa 

out ca.key 2048

生成CA根证书(自签名)

openssl req 

x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=MyCA"

1.2 生成服务器证书

bash

复制

下载

生成服务器私钥

openssl genrsa 

out server.key 2048

生成证书签名请求(CSR)

openssl req 

new -key server.key -out server.csr -subj "/CN=api.example.com"

 用CA证书签名服务器证书

openssl x509 

req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256

1.3 生成客户端证书

bash

复制

下载

生成客户端私钥

openssl genrsa 

-out client.key 2048

生成客户端CSR

openssl req 

new -key client.key -out client.csr -subj "/CN=MyClient"

用CA证书签名客户端证书

openssl x509 

req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256

2. 配置API网关的双向SSL

以下是常见API网关的配置方法:

2.1 AWS API Gateway

1. 上传服务器证书: 

进入AWS控制台 → API Gateway → 选择API → 证书管理 → 上传server.crt和server.key。

2. 启用双向SSL: 

在API的资源策略(Resource Policy)中添加要求客户端证书的配置:

json

复制

下载

{

"Version": "2012-10-17",

"Statement": [{

"Effect": "Deny",

"Principal": "*",

"Action": "execute-api:Invoke",

"Resource": "execute-api:/*/*/*",

"Condition": {

"Null": {

"ssl:ClientCert": "true"

}

在自定义域名配置中关联服务器证书。

2.2 Nginx作为API网关

nginx

复制

下载

server {

listen 443 ssl;

server_name api.example.com;

服务器证书配置

ssl_certificate /path/to/server.crt;

ssl_certificate_key /path/to/server.key;

启用客户端证书验证

ssl_client_certificate /path/to/ca.crt;  # 信任的CA证书(用于验证客户端)

ssl_verify_client on;  # 强制验证客户端证书

location / {

proxy_pass http://backend-service;

}

重启Nginx:nginx -s reload

2.3 Kong API网关

1. 创建证书对象:

bash

复制

下载

curl -X POST http://localhost:8001/certificates \

F "cert=@/path/to/server.crt" \

F "key=@/path/to/server.key"

2. 启用双向SSL:

bash

复制

下载

curl -X POST http://localhost:8001/routes/<route-id>/plugins \

d "name=mtls-auth" \

d "config.ca_certificates=@/path/to/ca.crt"

2.4 Spring Cloud Gateway

在application.yml中配置:

yaml

复制

下载

server:

ssl:

key-store: classpath:

server.p12

key-store-password:

changeit

key-alias:

server

client-auth: need  # 强制要求客户端证书

trust-store: classpath:

ca.crt

trust-store-password: changeit

3. 客户端调用(示例使用cURL)

客户端需携带证书和私钥:

bash

复制

下载

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

4. 验证与调试 

日志检查:查看API网关日志,确认客户端证书验证是否通过。 

证书链验证:确保客户端证书由受信任的CA签发,且服务器证书的CN/SAN匹配域名。 

工具调试: 

使用openssl s_client调试:

bash

复制

下载

openssl s_client -connect api.example.com:443 -cert client.crt -key client.key -CAfile ca.crt

用户需要注意一些事项

1. 证书信任链:客户端必须信任服务器的CA,服务器必须信任客户端的CA。

2. 证书有效期:定期更新过期证书。

3. 私钥保护:确保私钥文件权限严格(如chmod 400 *.key)。

4. 协议版本:禁用老旧协议(如SSLv3),推荐使用TLS 1.2/1.3。

5. 证书吊销:如有需要,配置CRL或OCSP检查。

用户根据以上四项步骤,客户就可以为API网关配置双向SSL证书认证,就能达到通信双方的身份安全可信。用户根据实际环境随时调整配置细节。