不同API网关在SSL证书配置上的机制差异很大。为了帮用户快速建立认知,我先用一个核心对比表格来概括,之后再展开各类网关的具体配置方法和自动化思路。
一、核心配置机制对比
特性/平台 Kong Apigee AWS API Gateway
配置核心 证书对象 (Certificate Object),绑定到服务路由。 目标服务器 (TargetServer) 与虚拟主机 (VirtualHost)。 域名配置 (Custom Domain Name)。
证书上传方式 Admin API / 声明式文件 / Kong Manager (UI)。 Management UI / Management API。 集成 AWS Certificate Manager (ACM) / 直接上传。
自动续期支持 支持,需配合外部工具或cert-manager (K8s)。 支持有限,依赖外部流程更新并重新部署。 完全自动 (使用ACM时)。
与CI/CD集成 灵活,可通过API或声明式配置(GitOps)完全自动化。 中等,通过API和Apigee DevOps插件实现。 深度集成,与AWS DevOps服务及ACM无缝衔接。
下面,我们来具体看看每类网关如何操作和实现自动化。
二、Kong:灵活的开源方案
Kong的证书管理非常灵活,但需要一些手动或通过工具链进行配置。
核心配置:在Kong中,你需要创建一个证书对象(关联证书和私钥),并将其与一个或多个SNI(服务器名称指示)字段绑定,然后这些证书才会在匹配的请求中生效。
自动化思路:
传统/混合部署:在CI/CD流水线中使用 curl 命令调用Kong的 Admin API 来创建或更新证书。证书和私钥需要安全地存放在CI系统的密钥库中。
Kubernetes环境(推荐):使用 Kong Ingress Controller 和 cert-manager。cert-manager 自动从Let‘s Encrypt等CA申请证书并存储为K8s Secret,Ingress Controller会自动发现并使用这些证书。这是自动化程度最高的方案。
参考命令示例:
bash
# 通过Admin API上传证书
curl -X POST http://<kong-admin-host>:8001/certificates \
-F "cert=@/path/to/cert.pem" \
-F "key=@/path/to/key.pem" \
-F "snis[]=example.com"
三、Apigee:企业级管理
Apigee的证书管理在其管理界面中完成,自动化需要通过API实现。
核心配置:证书在环境级别上传,然后配置在 TargetServer 或 VirtualHost 中引用,以决定哪个后端服务或哪个主机名使用哪个证书。
自动化思路:通过 Apigee Management API 实现证书的自动上传和配置更新。可以将此过程编写成脚本,集成到CI/CD流程中。Apigee也提供 Maven插件和Apigee Deploy Maven插件,支持将代理配置(可包含证书引用)的部署自动化。
关键步骤:
使用API上传证书到特定环境。
在API代理配置中,更新 TargetEndpoint 或 ProxyEndpoint 文件以指向新的证书。
使用Maven插件或API将更新后的代理部署到环境。
四、AWS API Gateway:云原生集成
AWS的方案与自家云服务深度集成,自动化体验最佳。
核心配置:为API的“自定义域名”配置SSL证书。证书必须来自 AWS Certificate Manager 或直接上传(不推荐)。
自动化思路(推荐使用ACM):
申请证书:在 AWS Certificate Manager 中为你的域名申请证书(支持自动续期,完全免费)。
关联域名:在API Gateway控制台创建自定义域名,直接从ACM下拉菜单中选择已验证的证书。
映射API:将自定义域名映射到具体的API阶段(如prod, dev)。
全自动化:以上所有步骤均可通过 AWS CloudFormation、Terraform 或 AWS CDK 用代码定义,并纳入CI/CD流程。证书续期由ACM全自动处理,无需人工干预。
优势:如果你完全在AWS生态内,这是最省心、自动化程度最高的方案,彻底免去了证书过期之忧。
五、配置建议与选择考量
技术栈决定方案
如果你的基础设施是 Kubernetes,Kong + cert-manager 的组合是云原生实践的标准选择。
如果你的业务完全跑在 AWS 上,AWS API Gateway + ACM 能提供最无缝的免运维体验。
如果你使用的是 混合云 或需要深度的API流量治理,Apigee 的企业级功能会更匹配,但需承担更复杂的运维成本。
安全与密钥管理:无论哪种方案,永远不要将证书私钥硬编码在代码或配置文件中。务必使用CI/CD系统(如GitLab CI Variables、Jenkins Credentials)或云服务商(如AWS Secrets Manager)的密钥管理服务来安全地存储和传递私钥。
部署后验证:在自动化脚本的最后一步,强烈建议添加一个验证环节。可以使用 openssl s_client -connect example.com:443 -servername example.com 这样的命令检查证书是否已正确部署并生效。
我希望这份针对不同网关的梳理能帮助你做出更合适的选择。如果用户能分享你正在评估或使用的具体技术栈(例如,是更倾向于开源方案还是云服务,是否已使用K8s),我可以为用户提供更具体的实施步骤参考。