用户为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证书认证,就能达到通信双方的身份安全可信。用户根据实际环境随时调整配置细节。