微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

amazon-web-services – NGINX:客户端证书

我的环境

我有带有Elastic Beanstalk的AWS API网关.我想在主机端使用客户端证书验证(Elastic Beanstalk). Elastic Beanstalk包含Load Balancer(ELB)和EC2以及Nginx和我的Ruby on Rails应用程序.我在API网关上生成了客户端证书.目前的流程是:

> API网关发送请求
>此请求通过Elastic Load Balancer(TCP端口80)并将其发送到端口80(TCP)上的EC2实例
>在EC2实例上,我在Docker中运行Nginx. Nginx容器侦听端口443,端口443绑定到主机的端口80.

API网关 – > (TCP 80)ELB(TCP 80) – > (端口80)主机 – > (端口443)Nginx容器

我的问题

我使用以下Nginx.conf,在那里我尝试进行客户端证书验证:

user  root;

error_log  /var/log/app-Nginx-error.log debug;
pid        /var/run/app-Nginx.pid;

events {
    worker_connections  8096;
    multi_accept        on;
    use                 epoll;
}

http {
    include       /etc/Nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$ssl_client_cert"';

    access_log /var/log/app-Nginx-access.log  main;

    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;
    keepalive_timeout  10;

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

    server {
      listen 443 default_server;
      root /var/www/public;
      client_max_body_size  16m;

      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;
      }

      location ^~ /assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }

      try_files $uri/index.html $uri @appserver;
      location @appserver {
        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://appserver;
        proxy_set_header X-Client-Verify $ssl_client_verify;
      }

      access_log    /var/log/app-Nginx-access.log;
      error_log     /var/log/app-Nginx-error.log debug;
      error_page    500 502 503 504 /500.html;
    }
}

但是,当我使用API​​网关发送Cert进行测试时,它总是返回403 – 它来自以下块:

 if ($ssl_client_verify != SUCCESS) {
    return 403;
  }

对我来说奇怪的是它不会进入任何先前的if语句,如果失败或没有.

如果我删除

 ssl_verify_client on;

它还涉及到:

 if ($ssl_client_verify != SUCCESS) {
    return 403;
  }

如果我再次添加ssl_verify_client并删除此if语句:

 if ($ssl_client_verify != SUCCESS) {
    return 403;
  }

一切都是向前传递 – 如果我发送带证书或无证书的请求并不重要.

我的问题

>我的Nginx.conf好吗? (也许我用TCP / HTTP混合了一些东西?)
>有没有办法获得Nginx的更多细节(是否有任何证书?),ssl_verify_client的结果是什么以及什么可以帮助检测问题?

解决方法:

在这里可能会非常错,但它看起来像你的设置

“API网关 – >(TCP 80)ELB(TCP 80) – >(端口80)主机 – >(端口443)Nginx容器”

也许应该是

API网关 – > (TCP 80)ELB(TCP 443) – > (端口443)Nginx容器 – > (端口80)主机

也就是说,Nginx应该坐在你的应用程序前面,而不是它的后面.

看起来你实际上并没有将Nginx的端口443代理到配置文件中应用程序的端口80.你在某处错过了一个proxy_pass或类似的东西.

您还提到了docker,您使用的是多容器环境还是单个容器环境?如果是前者,您应该(可以?)在Dockerrun.aws.json文件中指定Nginx-app端口映射.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐