【发布时间】:2016-05-26 21:41:52
【问题描述】:
我已经使用 AWS API Gateway 设置了一个基本 API,我想将我的端点链接到我在 EC2 实例上运行的服务(使用“HTTP 代理”集成类型)。我已经读过,为了锁定我的 EC2 服务器不接受来自 API 网关的流量,我基本上有以下两种选择之一:
- 将 EC2 实例粘贴在 VPC 后面,并使用具有 VPC 权限的 Lambda 函数(而不是 HTTP 代理)充当 API 请求的“传递”
- 在 API Gateway 中创建客户端证书,使用该证书发出我的后端请求,并在 EC2 实例上验证该证书。
我想使用 #2 的变体,而不是在 EC2 服务实例本身上验证证书,而是在另一个运行 Haproxy 的实例上进行验证。我已经使用 Haproxy 设置了第二个 EC2 实例,并将它指向我的另一个实例作为后端。我已经锁定了我的服务实例,所以它只会接受来自 Haproxy 实例的请求。这一切都在起作用。我一直在努力弄清楚的是如何在 Haproxy 机器上验证 AWS Gateway 客户端证书(我已经生成)。我已经进行了大量的谷歌搜索,关于如何做这件事的信息令人惊讶地为零。几个问题:
- 我阅读的所有内容似乎都表明我需要在我的 Haproxy 机器上生成 SSL 服务器证书并在配置中使用这些证书。我是否必须这样做,还是可以在不生成任何额外证书的情况下验证 AWS 客户端证书?
- 我所做的阅读表明我需要生成一个 CA,然后使用该 CA 来生成服务器和客户端证书。如果我确实需要生成服务器证书(在 Haproxy 机器上),如果我无法访问亚马逊用来创建网关客户端证书的 CA,我该如何生成它们?据我所知,我只能访问客户端证书本身。
这里有什么帮助吗?
解决方案更新
- 首先,我必须将我的 HAproxy 版本升级到 v1.5.14,以便获得 SSL 功能
- 我最初尝试使用letsencrypt 生成官方证书。虽然我能够让 API 网关使用此证书,但我无法在 API 网关将接受的 HAproxy 机器上生成 letencrypt 证书。该问题表现为 API 网关的“内部服务器错误”响应以及详细的 CloudWatch 日志中的“一般 SSLEngine 问题”。
- 然后我从 Gandi 购买了通配符证书,并在 HAproxy 机器上进行了尝试,但最初遇到了完全相同的问题。但是,我能够确定我的 SSL 证书的结构不是 API 网关想要的。我用谷歌搜索并在这里找到了 Gandi 链: https://www.gandi.net/static/CAs/GandiStandardSSLCA2.pem 然后我按如下方式构建了我的 SSL 文件:
我保存了这个新的 PEM 文件(作为 haproxy.pem)并在我的 HAproxy 前端绑定语句中使用它,如下所示:
bind :443 ssl crt haproxy.pem verify required ca-file api-gw-cert.pem
上述绑定语句中的 api-gw-cert.pem 是一个文件,其中包含我在 API 网关控制台中生成的客户端证书。现在,HAproxy 机器可以正确阻止来自网关以外任何地方的任何流量。
【问题讨论】:
标签: amazon-web-services ssl amazon-ec2 haproxy aws-api-gateway