2016-03-23 8 views
12

के साथ HTTPS पर बैकएंड सर्वर मेरे एडब्ल्यूएस ईएलबी पर बाहरी HTTPS कनेक्शन को समाप्त करने के लिए पहले से ही HTTPS है। अब मैं अपने ईएलबी और मेरे बैकएंड एनजीआईएनएक्स सर्वरों के बीच ईटी 2 पर एक स्व-हस्ताक्षरित प्रमाणपत्र के साथ एचटीटीपीएस का उपयोग करके अपने कनेक्शन को सुरक्षित करने का प्रयास कर रहा हूं। मैंने the documentation का पालन किया है, लेकिन 408 HTTP टाइमआउट में HTTPS परिणामों पर सर्वर तक पहुंच है। मुझे यह निर्धारित करने के लिए कोई भी डिबगिंग जानकारी नहीं मिल रही है कि चीजें कहां विफल रही हैं।एडब्ल्यूएस ईएलबी -> स्व-हस्ताक्षरित प्रमाणपत्र

  • मैंने पुष्टि की है कि सुरक्षा समूह ईसीबी पर ईएलबी और एनजीआईएनएक्स के बीच कनेक्शन की अनुमति देते हैं।
  • मैंने विश्वास दिलाया है कि वीपीसी ईएलबी और ईसी 2 नोड्स (HTTP भी ठीक काम करता है) के बीच यातायात को रूट करने की अनुमति देता है।
  • मैंने पुष्टि की है कि EC2 नोड पर HTTPS श्रोता काम कर रहा है (मैं इसे सीधे w/ओ ईएलबी के लिए जा रहा हिट कर सकते हैं।
  • मैं प्रकार PublicKeyPolicyType के ईएलबी नीति बनाई है, और मेरे सार्वजनिक कुंजी जुड़े।
  • मैं tyep BackendServerAuthenticationPolicyType के ईएलबी नीति बनाया है, और PublicKeyPolicyType के साथ जुड़े।
  • मैं ईएलबी साथ साथ BackendServerAuthenticationPolicyType संबद्ध कर दिया है।
  • मैं सुनिश्चित किया है कि SSLNegotiationPolicyType एल्गोरिदम और सिफर मैंने ऐसा उल्लेख किया समर्थन मेरे एनजीआईएनएक्स कॉन्फ़िगरेशन में
  • मुझे अपने एनजीआईएनएक्स एक्सेस लॉग में HTTP अनुरोध दिखाई देते हैं, लेकिन HTTPS अनुरोध नहीं।

क्या कोई तरीका है कि मैं इसका परीक्षण करने के लिए कोई अतिरिक्त नैदानिक ​​जानकारी प्राप्त कर सकता हूं?

$ 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>" 
      } 
     } 
    ] 
} 

यहाँ मेरी ईएलबी नीतियों हैं::

यहाँ मेरी ईएलबी विन्यास है

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

मैं पैदा कर रहा हूँ कुंजी/प्रमाण पत्र:

$ 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 config है निम्न आदेशों का उपयोग करके:

$ 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

क्या आप अनुपालन कारणों (पीसीआई/एचआईपीएए/आदि) के लिए ऐसा कर रहे हैं, या सिर्फ इसलिए कि आपको लगता है कि आपको इसकी आवश्यकता है? ईएलबी और वेब सर्वर के बीच नेटवर्क यातायात आपके वीपीसी के भीतर निहित होगा, इसलिए अगर किसी हमलावर को आपके वीपीसी के भीतर किसी सर्वर तक पहुंच प्राप्त हो तो केवल तभी समझौता किया जाएगा। ईएलबी को एसएसएल आम तौर पर तब तक पर्याप्त माना जाता है जब तक कि आपके पास "गति में एन्क्रिप्शन" के लिए कानूनी आवश्यकताएं न हों। –

+0

हां, हमारे पास तार पर चलने वाले ट्रैफ़िक को एन्क्रिप्ट करने के लिए कानूनी आवश्यकताएं हैं, और यह एक अच्छी प्रथा है। – jsears

+0

श्रोता के लिए 'इंस्टेंस प्रोटोकॉल' सेटिंग 'HTTPS' (कंसोल में) पर सेट है? एचटीटीपीएस और 443 को उस स्क्रीन पर बाईं तरफ और दाईं तरफ सेट करने की आवश्यकता है, और दाएं तरफ डिफ़ॉल्ट HTTP है ... मुझे नुकसान होता है कि 408 का कारण क्या होगा। –

उत्तर

5

एनजीआईएनएक्स कॉन्फ़िगरेशन में कुछ गैर-ईसी डीएचई सिफर जोड़ने से यह मेरे लिए हल हो गया। मैं nginx.conf में HTTPS श्रोता में निम्नलिखित config बदल लिया है!:

# 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'; 

मैं सभी गैर-चुनाव आयोग DHE सिफर ड्रॉप करने और केवल ECDHE का समर्थन करना चाहते हैं। मुझे संदेह है कि यह समस्या को हल करता है क्योंकि मैं ईसी कुंजी/प्रमाण के बजाय आरएसए कुंजी/प्रमाण उत्पन्न कर रहा हूं। अगर कोई जानता है कि मैं ईसी कुंजी/प्रमाण को सही तरीके से कैसे उत्पन्न कर सकता हूं, और फिर एडब्ल्यूएस पर अपलोड करने के लिए ईसी सार्वजनिक कुंजी को सही ढंग से निकालें, तो कृपया मेरे उत्तर में सुधार करें। मैंने ईसी कुंजी/प्रमाण उत्पन्न करने का प्रयास किया है, लेकिन जब मैं ईएलबी सार्वजनिक कुंजी नीति बनाने की कोशिश करता हूं, तो एडब्ल्यूएस इसे एक अवैध सार्वजनिक कुंजी के रूप में रिपोर्ट करता है।

+1

क्या आप अपनी ईसी कुंजी/प्रमाण पत्र बनाने और अपलोड करने के लिए उपयोग किए गए निर्देश/आदेशों को शामिल करने के लिए अपनी पोस्ट अपडेट कर सकते हैं, और उस ईसी कुंजी/प्रमाण को अपलोड करने का प्रयास करते समय आपको एडब्ल्यूएस से वापस आने वाली सटीक त्रुटि/प्रतिक्रिया? – Castaglia

+1

यह मेरे लिए काम किया। मैं पहले nginx के लिए "मोज़िला मॉडर्न" एसएसएल कॉन्फ़िगरेशन का उपयोग कर रहा था और "इंटरमीडिएट" पर स्विच करने पर बस सबकुछ काम करता था। सभी आधुनिक सिफर "ईसीडीएचई-" से शुरू होते हैं जबकि मध्यवर्ती में कुछ "डीएचई-", "एईएस 128-", "एईएस 256-" और "ईडीएच-" शामिल हैं। मैंने यह देखने के लिए गहराई से खोला नहीं है कि वास्तव में कौन से एडब्ल्यूएस ईएलबी उपयोग कर रहे हैं। – notpeter

+0

धन्यवाद - एक ही समस्या थी, सिफर की जरूरत थी। – Brett

संबंधित मुद्दे