2017-01-23 27 views
4

私の環境nginxの:クライアント側の証明書

私は、Elastic BeanstalkでAWSとAPIゲートウェイを持っています。私は、ホスト側(Elastic Beanstalk)でクライアント側の証明書の検証を使用したいと思います。 Elastic Beanstalkは、ロードバランサ(ELB)とNGINXと私のRuby on Railsアプリケーションを備えたEC2で構成されています。 APIゲートウェイでクライアント側の証明書を生成しました。電流の流れは次のとおりです。ゲートウェイがこの要求

  • を要求送信

    1. APIは、弾性ロードバランサ(TCPポート80)を通過し、ポート80でEC2インスタンスにfutherに送信する(TCP)
    2. 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; 
        } 
    

    エター私は証明書付きで、または証明書なしで要求を送るかどうかは関係ありません。

    私の質問

    1. 私nginx.confはOKです? (たぶん私はTCP/HTTPと何かを混合してしまったでしょうか?)
    2. NGINXにはどのような詳細がありますか(どの証明書もありますか?)、ssl_verify_clientの結果は何ですか?問題?
  • 答えて

    1

    私はここで非常に間違っている可能性が、それはあなたのセットアップ

    「API Gatewayのように見えます - >(TCP 80)ELB(TCP 80) - >(ポート80)ホスト - >(ポート443)nginxのコンテナ」

    は多分

    APIであるべきゲートウェイ - >(TCP 80)ELB(TCP ) - >(ポート443)nginxのコンテナ - >(ポート80)ホスト

    ある

    、 nginxは座っている必要がありますあなたのアプリの前に、それの後ろではありません。

    あなたの設定ファイルのアプリケーションのポート80にnginxのポート443を実際にプロキシしていないようです。どこかでproxy_passなどがありません。

    あなたはまた、ドッカーに言及しましたか、マルチコンテナ環境または単一のコンテナを使用していますか?前者の場合は、Dockerrun.aws.jsonファイルにnginx-appポートマッピングを指定する必要がありますか?

    +0

    私はそれを少しテストしました。私の問題は、私は "ssl on"を設定していないということでした。およびサーバー証明書。それがなければ、空の$ ssl_client_verifyが得られます。条件:if($ ssl_client_verify = "")でチェックしました。私はマルチコンテナを実行しており、nginxもコンテナで実行されています。その後、私のアプリで渋滞の容器にトラフィックを渡します。 – nicq

    +0

    @nicqそれで、あなたはそれを働かせましたか?はいの場合、他の誰かが同様の問題に遭遇した場合に備えてconfig/setupを投稿した方が良いでしょう。 – joakim

    +0

    私はそれをローカルでテストしましたが、私はEBでそれを行うつもりです。次に、私は完全な答えを "どこと"設定する必要があります:api gateway、elb、eb、nginx。 – nicq

    関連する問題