AWS API ECS 中 .NET Core Web Api 运行 的网关

AWS API Gateway to .NET Core Web Api running in ECS

编辑

我现在意识到我需要在服务器上安装证书并单独验证客户端证书。我在看 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 网关与实例建立 HTTPS 连接,并传递可验证的客户端证书。

原版POST

我正在尝试配置新的微服务环境,但遇到了一些问题。

这是我想要实现的目标:

为了防止客户端直接调用services.company.com.au,API网关配置了客户端证书。

在我的网站 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 网关只能访问 public 个负载均衡器,这会使应用程序负载均衡器的 DNS 上的服务保持打开状态。

我不确定哪里出了问题,但我怀疑我没有正确配置 .NET Core/Kestrel 以使用客户端证书终止 SSL。

关于这个整体架构,如果:

  1. public Application Load Balancer 可以与使用 API 网关的客户端证书的 HTTPS 侦听器一起使用以终止 SSL 连接
  2. API 网关可以在不使用 Lambda 作为代理的情况下连接到内部负载均衡器

我们会考虑任何提示或建议,但目前的主要目标是让第一个架构正常工作。

我需要更多信息让我知道,我会更新问题。

问题是由附加到构成 ECS 集群的 EC2 实例的安全组不允许正确的端口范围引起的。集群中每个 EC2 实例的安全组需要允许 ECS 动态端口范围。