【问题标题】:Api Gateway connection with Elastic Beanstalk (client-side SSL Certificate)与 Elastic Beanstalk 的 Api 网关连接(客户端 SSL 证书)
【发布时间】:2017-06-18 07:06:03
【问题描述】:

我正在尝试将 Api Gateway 与我在 Elastic Beanstalk 中的 api 连接起来。我希望我的 api 只能由 Api Gateway 访问,为此我在后端使用客户端 SSL 证书授权(如这个 aws 出版物链接:http://docs.aws.amazon.com/es_es/apigateway/latest/developerguide/getting-started-client-side-ssl-authentication.html)。所以我的架构是这样的:

API GATEWAY->弹性负载平衡器->EC2 (ELASTIC BEANSTALK)

我的 EC2 机器有 NGINX 和 Ruby。

连接是这样工作的:

API 网关 -> (80 端口) -> 弹性负载均衡器 -> (443 端口) -> NGINX -> RUBY

我正在 NGINX 中进行客户端身份验证。 当我使用浏览器访问 Elastic Load Balancer 时,它显示 400 Bad Request - NGINX error: No required SSL certificate was sent(这是正确的,因为我没有发送证书)。但是当我使用 Api Gateway 访问并发送客户端证书时,我得到了同样的错误(我不明白为什么)。

当我在 NGINX 中配置 SSL 连接时,我使用的是我签名的 SSL 证书(也许这是问题所在?)

我的问题的其他可能原因是 Elastic Load Balancer 中的端口配置(如图)。我有后端身份验证:已禁用。这是一个问题吗? Pictura Port Config ELB

我的nginx配置是:

upstream my_app {
  server unix:///var/run/puma/my_app.sock;
}

log_format healthd '$msec"$uri"'
                '$status"$request_time"$upstream_response_time"'
                '$http_x_forwarded_for';

server {
listen       443 ssl;
listen       [::]:443 ssl;
server_name  localhost;
root         /usr/share/nginx/html;

ssl on;
ssl_certificate /etc/nginx/ssl/dev.crt;
ssl_certificate_key /etc/nginx/ssl/dev.key;
ssl_trusted_certificate /etc/nginx/ssl/api-gateway.pem;
ssl_client_certificate /etc/nginx/ssl/api-gateway.pem;
ssl_verify_client on;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
if ($ssl_client_verify = FAILED) {
        return 495;
}
if ($ssl_client_verify = NONE) {
    return 402;
}
if ($ssl_client_verify != SUCCESS) {
    return 403;
}
try_files $uri/index.html $uri @my_app;
  location @my_app {
    proxy_set_header  Host $host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Host $server_name;
    proxy_set_header  Client-IP $remote_addr;
            proxy_pass        http://my_app;
    proxy_set_header X-Client-Verify $ssl_client_verify;
  }
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
    proxy_pass http://my_app; # match the name of upstream directive which is defined above
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header gonzalo1 $ssl_client_verify;
}
error_page 404 /404.html;
    location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
    location = /50x.html {
}

}

【问题讨论】:

  • 文档链接是关于使用客户端证书调用 Api Gtw 而不是使用 Api Gtw 客户端证书调用您的 beanstalk。我错过了什么吗?您知道 Api Gtw 客户端证书用于调用 Api Gtw 而不是使用 Api Gtw 调用其他东西!
  • @fsenart,据我了解,这种情况下的证书是用于从 Api 网关调用后端的,并且后端可以通过证书验证请求来自 Api 网关。在第一段的链接很清楚。
  • 不,@fsenart,API 网关使用客户端证书向应用服务器进行身份验证。
  • ...但这不适用于侦听端口 80 的 ELB,也不适用于 http 模式下的 ELB。它必须处于 TCP 模式。

标签: amazon-web-services ssl nginx amazon-elastic-beanstalk aws-api-gateway


【解决方案1】:

Amazon API Gateway 不支持集成终端节点的自签名证书。您是否尝试过使用来自 Amazon Certificate Manager 或 Let's Encrypt 的证书?

【讨论】:

  • 这也是正确的,但不是这个特定问题的原因。当此处的解决方案产生新错误时,这将是 OP 下一个问题的答案。 :)
  • 您好,您可以在哪里使用 nginx 以及如何完成此操作?
  • @Stefano 我们如何使用 AWS Certificate Manager 推送客户端证书(API Gateway 提供的证书)。 ?有什么想法、想法吗?
  • @NishutoshSharma 不幸的是,现在没有办法做到这一点。 API Gateway 不允许您访问证书的私钥。我会将其添加为功能请求。
  • @StefanoBuliani 你可以在这里回答另一个问题。详细的解决方案? stackoverflow.com/questions/48782619/…
猜你喜欢
  • 2012-08-25
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2018-07-24
  • 2017-04-28
  • 2019-08-13
  • 2020-05-16
相关资源
最近更新 更多