【发布时间】:2018-04-26 22:28:03
【问题描述】:
编辑
我现在意识到我需要在服务器上安装证书并单独验证客户端证书。我在看https://github.com/xavierjohn/ClientCertificateMiddleware
我认为证书必须来自 AWS doco 中列出的 CA 之一 - http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-supported-certificate-authorities-for-http-endpoints.html
此证书允许 API Gateway 与实例建立 HTTPS 连接,并传递可验证的客户端证书。
原帖
我正在尝试配置新的微服务环境,但遇到了一些问题。
这是我想要实现的目标:
- Angular 网站通过 API Gateway 连接到后端 API(URL:
gateway.company.com.au) - API 网关配置有 4 个阶段 - DEV、UAT、PreProd 和 PROD
- API Gateway 中的资源是通过网络负载均衡器连接到后端服务的 HTTP 代理。每个阶段的每个服务都会分配一个不同的端口:即 DEV 为 30,000、30,001 等,UAT 为 31,000、31,000 等
- 网络负载平衡器的 DNS 为
services.company.com.au - AWS ECS 为后端服务托管 docker 容器。这些服务是 .NET Core 2.0 Web API 项目
- ECS 任务定义指定要使用的容器镜像,并配置了端口映射 - 主机端口:0 容器端口:4430。主机端口 0 由 ECS 动态分配。
- 网络负载均衡器对每个微服务端口都有一个监听器,并将请求转发到目标组。每个环境的每个服务都有一个目标群体。
- 目标组包括 ECS 集群中的两个 EC2 实例,并且端口由 ECS 动态分配
- 这个端口然后被ECS/Docker映射到容器端口4430
为了防止客户端直接调用services.company.com.au,API网关配置了客户端证书。
在我的 Web API 中,我按如下方式构建网络主机:
.UseKestrel(options =>
{
options.Listen(new IPEndPoint(IPAddress.Any, 4430), listenOptions =>
{
const string certBody = "-----BEGIN CERTIFICATE----- Copied from API Gateway Client certificate -----END CERTIFICATE-----";
var cert = new X509Certificate2(Encoding.UTF8.GetBytes(certBody));
var httpsConnectionAdapterOptions = new HttpsConnectionAdapterOptions
{
ClientCertificateMode = ClientCertificateMode.AllowCertificate,
SslProtocols = System.Security.Authentication.SslProtocols.Tls,
ServerCertificate = cert
};
listenOptions.UseHttps(httpsConnectionAdapterOptions);
});
})
我的 DockerFile 是:
FROM microsoft/aspnetcore:2.0
ARG source
WORKDIR /app
EXPOSE 80 443
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "microservice.company.com.au.dll"]
当我使用 Postman 尝试访问该服务时,我收到了 504 Gateway timeout。 CloudWatch 日志显示:
(e4d594b7-c8f3-11e7-8458-ef6f94e65b64) Sending request to http://microservice.company.com.au:30000/service
(e4d594b7-c8f3-11e7-8458-ef6f94e65b64) Execution failed due to an internal error
(e4d594b7-c8f3-11e7-8458-ef6f94e65b64) Method completed with status: 504
我已经能够使以下架构工作:
- API 网关
- Application Load Balancer - 基于路径的路由以定向到正确的容器
- ECS 管理负载均衡器上的端口
- 容器监听 HTTP 80 端口
不幸的是,由于 API Gateway 只能访问公共负载均衡器,这使得应用程序负载均衡器的 DNS 上的服务处于打开状态。
我不确定它在哪里失败,但我怀疑我没有正确配置 .NET Core/Kestrel 以使用客户端证书终止 SSL。
就整体架构而言,如果:
- 公共 Application Load Balancer 可与 HTTPS 侦听器一起使用,使用 API 网关的客户端证书终止 SSL 连接
- API 网关无需使用 Lambda 作为代理即可连接到内部负载均衡器
我们会考虑任何提示或建议,但目前的主要目标是让第一个架构工作。
如果需要更多信息,请告诉我,我会更新问题。
【问题讨论】:
标签: amazon-web-services asp.net-core aws-api-gateway amazon-elb amazon-ecs