我的环境
我有Elastic Beanstalk的AWS API网关。 我想在主机端使用客户端证书validation(Elastic Beanstalk)。 Elastic Beanstalk由负载平衡器(ELB)和EC2与NGINX和我的Ruby on Rails应用程序组成。 我已经在API网关上生成了客户端证书。 目前的stream量是:
API网关 – >(TCP 80)ELB(TCP 80) – >(端口80)主机 – >(端口443)NGINX容器
我的问题
我使用以下nginx.conf,我试图做客户端证书validation:
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 Gateway发送Cert来testing它时,它始终返回403 – 它来自以下块:
if ($ssl_client_verify != SUCCESS) { return 403; }
对我来说奇怪的是,它没有进入任何以前的陈述与失败或无 。
如果我删除:
ssl_verify_client on;
它也进入:
if ($ssl_client_verify != SUCCESS) { return 403; }
如果我再次把ssl_verify_client放在上面,并删除这个if语句:
if ($ssl_client_verify != SUCCESS) { return 403; }
一切都传递给我 – 如果我发送请求与证书或没有证书无关紧要。
我的问题
我可能在这里是非常错误的,但它看起来像你的设置
“API网关 – >(TCP 80)ELB(TCP 80) – >(端口80)主机 – >(端口443)NGINX容器”
也许应该是
API网关 – >(TCP 80)ELB(TCP 443 ) – >(端口443)NGINX容器 – >(端口80)主机
也就是说,nginx应该坐在你的应用前面,而不是在它之后。
它也看起来像你实际上不是在你的配置文件中代理nginx的端口443到你的应用程序的端口80。 你错过了一个proxy_pass或类似的地方。
你还提到码头工人,你使用多容器环境还是单个容器? 如果前者,你应该(可以?)在Dockerrun.aws.json文件中指定nginx-app端口映射。