私は、Elastic BeanstalkでAWSとAPIゲートウェイを持っています。私は、ホスト側(Elastic Beanstalk)でクライアント側の証明書の検証を使用したいと思います。 Elastic Beanstalkは、ロードバランサ(ELB)とNGINXと私のRuby on Railsアプリケーションを備えたEC2で構成されています。 APIゲートウェイでクライアント側の証明書を生成しました。電流の流れは次のとおりです。ゲートウェイがこの要求
- APIは、弾性ロードバランサ(TCPポート80)を通過し、ポート80でEC2インスタンスにfutherに送信する(TCP)
- EC2インスタンス上で、私はDockerでNGINXを実行しています。 >(TCP 80)ELB(TCP 80) - - >(ポート80)ホスト - nginxのコンテナがポート80
API Gatewayのをホストするためにバインドされたポート443上でリッスン>(ポート443)nginxのコンテナ
私の問題
私はクライアント側の証明書の検証をしようと、次のnginx.conf、使用:私はCerをを送信するAPIゲートウェイでそれをテストするとき、しかし
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;
}
}
をそれは常に403を返すのt - それは、次のブロックから来ている:私のため
if ($ssl_client_verify != SUCCESS) {
return 403;
}
奇妙なことがと文がかNONEをFAILEDない場合、それは以前のに入らないということです。
私は削除する場合:私はに再びssl_verify_clientを入れて、この if文を削除した場合
if ($ssl_client_verify != SUCCESS) {
return 403;
}
:
ssl_verify_client on;
それはまたに入る
if ($ssl_client_verify != SUCCESS) {
return 403;
}
エター私は証明書付きで、または証明書なしで要求を送るかどうかは関係ありません。
私の質問
- 私nginx.confはOKです? (たぶん私はTCP/HTTPと何かを混合してしまったでしょうか?)
- NGINXにはどのような詳細がありますか(どの証明書もありますか?)、ssl_verify_clientの結果は何ですか?問題?
私はそれを少しテストしました。私の問題は、私は "ssl on"を設定していないということでした。およびサーバー証明書。それがなければ、空の$ ssl_client_verifyが得られます。条件:if($ ssl_client_verify = "")でチェックしました。私はマルチコンテナを実行しており、nginxもコンテナで実行されています。その後、私のアプリで渋滞の容器にトラフィックを渡します。 – nicq
@nicqそれで、あなたはそれを働かせましたか?はいの場合、他の誰かが同様の問題に遭遇した場合に備えてconfig/setupを投稿した方が良いでしょう。 – joakim
私はそれをローカルでテストしましたが、私はEBでそれを行うつもりです。次に、私は完全な答えを "どこと"設定する必要があります:api gateway、elb、eb、nginx。 – nicq