2016-03-23 16 views
12

AWS ELBで外部HTTPS接続を終了するためのHTTPSが既に用意されています。私は現在、ELBと自己署名証明書付きHTTPSを使用しているEC2のバックエンドNGINXサーバとの間の接続を保護しようとしています。私はthe documentationをフォローしましたが、HTTPS経由でサーバーにアクセスすると408 HTTPタイムアウトになります。何が失敗しているのかを判断するためのデバッグ情報は得られないようです。AWS ELB - >自己署名入り証明書付きHTTPS経由のバックエンドサーバ

  • セキュリティグループがEC2のELBとNGINX間の接続を許可していることを確認しました。
  • 私は、VPCがトラフィックをELBとEC2ノード間でルーティングできることを確認しました(HTTPも正常に動作します)。
  • 私は、EC2ノードのHTTPSリスナーが動作していることを確認しました(私はELBに行くことなく直接ヒットできます)。
  • 私はPublicKeyPolicyTypeタイプのELBポリシーを作成し、公開鍵を関連付けました。私はtyep BackendServerAuthenticationPolicyTypeのELBポリシーを作成し、そしてPublicKeyPolicyTypeでそれが関連付けられています。
  • 私はELBとにBackendServerAuthenticationPolicyTypeが関連付けられています。
  • 私はSSLNegotiationPolicyTypeは私が指定したアルゴリズムと暗号をサポートしていることを確実にしている
  • 私のNGINX設定で。
  • 私のNGINXアクセスログにHTTPリクエストが表示されますが、HTTPSリクエストは表示されません。

これをテストするために追加の診断情報を得る方法はありますか?ここで

は私のELB構成である:ここで

$ aws elb describe-load-balancers --load-balancer-name <MY-ELB-NAME> 

{ 
    "LoadBalancerDescriptions": [ 
     { 
      "Subnets": [ 
       "<REDACTED>", 
       "<REDACTED>", 
       "<REDACTED>" 
      ], 
      "CanonicalHostedZoneNameID": "<REDACTED>", 
      "VPCId": "<REDACTED>", 
      "ListenerDescriptions": [ 
       { 
        "Listener": { 
         "InstancePort": 80, 
         "LoadBalancerPort": 80, 
         "Protocol": "HTTP", 
         "InstanceProtocol": "HTTP" 
        }, 
        "PolicyNames": [] 
       }, 
       { 
        "Listener": { 
         "InstancePort": 443, 
         "SSLCertificateId": "<REDACTED>", 
         "LoadBalancerPort": 443, 
         "Protocol": "HTTPS", 
         "InstanceProtocol": "HTTPS" 
        }, 
        "PolicyNames": [ 
         "ELBSecurityPolicy-2015-05" 
        ] 
       } 
      ], 
      "HealthCheck": { 
       "HealthyThreshold": 2, 
       "Interval": 30, 
       "Target": "HTTP:80/health", 
       "Timeout": 10, 
       "UnhealthyThreshold": 2 
      }, 
      "BackendServerDescriptions": [ 
       { 
        "InstancePort": 443, 
        "PolicyNames": [ 
         "MyBackendServerAuthenticationPolicy" 
        ] 
       } 
      ], 
      "Instances": [ 
       { 
        "InstanceId": "<REDACTED>" 
       } 
      ], 
      "DNSName": "<REDACTED>.us-west-2.elb.amazonaws.com", 
      "SecurityGroups": [ 
       "<GROUP_ID>" 
      ], 
      "Policies": { 
       "LBCookieStickinessPolicies": [], 
       "AppCookieStickinessPolicies": [], 
       "OtherPolicies": [ 
        "ELBSecurityPolicy-2015-05", 
        "MyBackendServerAuthenticationPolicy", 
        "MyPublicKeyPolicy" 
       ] 
      }, 
      "LoadBalancerName": "<MY-ELB-NAME>", 
      "CreatedTime": "2016-03-23T20:58:49.490Z", 
      "AvailabilityZones": [ 
       "us-west-2a", 
       "us-west-2b", 
       "us-west-2c" 
      ], 
      "Scheme": "internal", 
      "SourceSecurityGroup": { 
       "OwnerAlias": "<REDACTED>", 
       "GroupName": "<GROUP_NAME>" 
      } 
     } 
    ] 
} 

は私のELBのポリシーです:ここ

$ aws elb describe-load-balancer-policies --load-balancer-name <MY-ELB-NAME> 
{ 
    "PolicyDescriptions": [ 
     { 
      "PolicyAttributeDescriptions": [ 
       { 
        "AttributeName": "Reference-Security-Policy", 
        "AttributeValue": "ELBSecurityPolicy-2015-05" 
       }, 
       ... 
       { 
        "AttributeName": "Protocol-TLSv1.2", 
        "AttributeValue": "true" 
       }, 
       ... 
       { 
        "AttributeName": "ECDHE-RSA-AES128-GCM-SHA256", 
        "AttributeValue": "true" 
       }, 
       ... 
      ], 
      "PolicyName": "ELBSecurityPolicy-2015-05", 
      "PolicyTypeName": "SSLNegotiationPolicyType" 
     }, 
     { 
      "PolicyAttributeDescriptions": [ 
       { 
        "AttributeName": "PublicKeyPolicyName", 
        "AttributeValue": "MyPublicKeyPolicy" 
       } 
      ], 
      "PolicyName": "MyBackendServerAuthenticationPolicy", 
      "PolicyTypeName": "BackendServerAuthenticationPolicyType" 
     }, 
     { 
      "PolicyAttributeDescriptions": [ 
       { 
        "AttributeName": "PublicKey", 
        "AttributeValue": "<REDACTED>" 
       } 
      ], 
      "PolicyName": "MyPublicKeyPolicy", 
      "PolicyTypeName": "PublicKeyPolicyType" 
     } 
    ] 
} 

は私のnginxの設定ファイルである:

worker_processes 10; 
worker_rlimit_nofile 8192; 
events { 
    worker_connections 4096; 
} 

error_log syslog:server=unix:/dev/log error; 
pid  logs/nginx.pid; 

http { 
    default_type application/octet-stream; 

    log_subrequest on; 
    access_log syslog:server=unix:/dev/log,severity=debug extended; 

    tcp_nodelay on; 
    tcp_nopush  on; 

    server_tokens off; 

    upstream api { 
    server localhost:8080; 
    } 

    server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    location/{ 
     # Redirect all other HTTP requests to HTTPS with a 301 Moved Permanently response. 
     return 301 https://$host$request_uri; 
    } 
    } 

    server { 
    listen 443 ssl; 
    listen [::]:443 ssl; 

    ssl_certificate /path/to/ssl.crt; 
    ssl_certificate_key /path/to/ssl.key; 
    ssl_session_timeout 1d; 
    ssl_session_cache shared:SSL:50m; 
    ssl_session_tickets off;ECDHE 

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits 
    ssl_dhparam /path/to/dhparam.pem; 

    # modern configuration. tweak to your needs. 
    # See: https://mozilla.github.io/server-side-tls/ssl-config-generator/ 
    ssl_protocols TLSv1.2; 
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; 
    ssl_prefer_server_ciphers on; 

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains;"; 

    # Our main location to proxy everything else to the upstream 
    # server, but with the added logic for enforcing HTTPS. 
    location/{ 
     proxy_http_version 1.1; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_next_upstream error; 

     proxy_pass http://api; 
    } 
    } 
} 

私は鍵/証明書を生成しています次のコマンドを使用します。

$ openssl genrsa \ 
    -out /path/to/ssl.key 2048 
$ openssl req \ 
    -sha256 \ 
    -new \ 
    -key /path/to/ssl.key \ 
    -out /path/to/ssl.csr 
$ openssl x509 \ 
    -req \ 
    -days 365 \ 
    -in /path/to/ssl.csr \ 
    -signkey /path/to/ssl.key \ 
    -out /path/to/ssl.crt 
$ openssl dhparam -out /path/to/dhparam.pem 2048 
+1

コンプライアンス上の理由(PCI/HIPAA /など)のためか、必要と思われるだけの理由ですか? ELBとWebサーバー間のネットワークトラフィックはVPC内に格納されるため、攻撃者がVPC内のサーバーにアクセスした場合にのみ侵害されます。 ELBへのSSLは、「モーション暗号化」の法的要件がない限り、一般的に十分だと考えられています。 –

+0

はい、私たちは、有線を経由するトラフィックを暗号化するための法的要件を持っています。これは良い方法です。 – jsears

+0

リスナーの 'Instance Protocol'設定は(コンソールの)' HTTPS'に設定されていますか?その画面の左側と右側にHTTPSと443を設定する必要があります。右側のデフォルトはHTTPです...これは408の原因になると思います。 –

答えて

5

非EC DHE暗号をNGINX設定に追加すると、これが解決されました。私はnginx.confでHTTPSリスナーに、以下の設定に切り替えた:

# intermediate configuration. tweak to your needs. 
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; 

私はすべての非EC DHE暗号をドロップするだけECDHEをサポートしたいと思います。私は、ECキー/証明書の代わりにRSAキー/証明書を生成しているため、この問題が修正されたと思われます。 ECキー/証明書を適切に生成してから、AWSへのアップロード用のEC公開鍵を正しく抽出する方法を知っている人は、私の回答を改善してください。私はECキー/証明書を生成しようとしましたが、ELB公開鍵ポリシーを作成しようとするとAWSはそれを無効な公開鍵として報告します。

+1

ECキー/証明書の作成とアップロードに使用した命令/コマンドと、そのECキー/証明書をアップロードしようとしたときにAWSから返された正確なエラー/応答を含むように投稿を更新できますか? – Castaglia

+1

これは私のために働いた。私は以前、nginxの "Mozilla Modern" SSL設定を使用していました。すべての現代の暗号は "ECDHE-"で始まり、中間には "DHE-"、 "AES128-"、 "AES256-"、 "EDH-"が含まれています。 AWS ELBが実際にどのAWBを使用しているかを調べるために深く掘り下げたわけではありません。 – notpeter

+0

ありがとうございました - 同じ問題があって、暗号が必要でした。 – Brett

関連する問題