AWS ELB -> Serveur principal sur HTTPS avec certificate auto-signé

J’ai déjà HTTPS en place pour mettre fin à des connexions HTTPS externes sur mon AWS ELB. J’essaie maintenant de sécuriser mes connexions entre mon serveur ELB et mes serveurs NGINX dorsaux sur EC2 en utilisant HTTPS avec un certificate auto-signé. J’ai suivi la documentation , mais l’access au serveur via HTTPS entraîne un délai d’attente 408 HTTP. Je ne peux pas sembler obtenir des informations de débogage pour déterminer où les choses échouent.

  • J’ai confirmé que les groupes de sécurité permettent les connexions entre l’ELB et NGINX sur EC2.
  • J’ai compris que le VPC permettait le routage du trafic entre les nœuds ELB et EC2 (HTTP fonctionne également).
  • J’ai confirmé que l’auditeur HTTPS sur le nœud EC2 fonctionne (je peux le bash directement sans passer par l’ELB.
  • J’ai créé une stratégie ELB de type PublicKeyPolicyType et associé ma clé publique.
  • J’ai créé une stratégie ELB de tyep BackendServerAuthenticationPolicyType et l’ai associée à PublicKeyPolicyType.
  • J’ai associé le BackendServerAuthenticationPolicyType à l’ELB.
  • Je me suis assuré que SSLNegotiationPolicyType prend en charge les algorithmes et les chiffrements que j’ai spécifiés dans ma configuration NGINX.
  • Je vois des requêtes HTTP dans mes journaux d’access NGINX, mais pas dans les requêtes HTTPS.

Est-il possible d’obtenir des informations de diagnostic supplémentaires pour tester cela?

Voici ma configuration ELB:

$ aws elb describe-load-balancers --load-balancer-name  { "LoadBalancerDescriptions": [ { "Subnets": [ "", "", "" ], "CanonicalHostedZoneNameID": "", "VPCId": "", "ListenerDescriptions": [ { "Listener": { "InstancePort": 80, "LoadBalancerPort": 80, "Protocol": "HTTP", "InstanceProtocol": "HTTP" }, "PolicyNames": [] }, { "Listener": { "InstancePort": 443, "SSLCertificateId": "", "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": "" } ], "DNSName": ".us-west-2.elb.amazonaws.com", "SecurityGroups": [ "" ], "Policies": { "LBCookieStickinessPolicies": [], "AppCookieStickinessPolicies": [], "OtherPolicies": [ "ELBSecurityPolicy-2015-05", "MyBackendServerAuthenticationPolicy", "MyPublicKeyPolicy" ] }, "LoadBalancerName": "", "CreatedTime": "2016-03-23T20:58:49.490Z", "AvailabilityZones": [ "us-west-2a", "us-west-2b", "us-west-2c" ], "Scheme": "internal", "SourceSecurityGroup": { "OwnerAlias": "", "GroupName": "" } } ] } 

Voici mes politiques ELB:

 $ aws elb describe-load-balancer-policies --load-balancer-name  { "PolicyDescriptions": [ { "PolicyAtsortingbuteDescriptions": [ { "AtsortingbuteName": "Reference-Security-Policy", "AtsortingbuteValue": "ELBSecurityPolicy-2015-05" }, ... { "AtsortingbuteName": "Protocol-TLSv1.2", "AtsortingbuteValue": "true" }, ... { "AtsortingbuteName": "ECDHE-RSA-AES128-GCM-SHA256", "AtsortingbuteValue": "true" }, ... ], "PolicyName": "ELBSecurityPolicy-2015-05", "PolicyTypeName": "SSLNegotiationPolicyType" }, { "PolicyAtsortingbuteDescriptions": [ { "AtsortingbuteName": "PublicKeyPolicyName", "AtsortingbuteValue": "MyPublicKeyPolicy" } ], "PolicyName": "MyBackendServerAuthenticationPolicy", "PolicyTypeName": "BackendServerAuthenticationPolicyType" }, { "PolicyAtsortingbuteDescriptions": [ { "AtsortingbuteName": "PublicKey", "AtsortingbuteValue": "" } ], "PolicyName": "MyPublicKeyPolicy", "PolicyTypeName": "PublicKeyPolicyType" } ] } 

Voici ma configuration 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_certificatee /path/to/ssl.crt; ssl_certificatee_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 Ssortingct-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; } } } 

Je génère des clés / certificates en utilisant les commandes suivantes:

 $ 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 

L’ajout de certains chiffrements DHE non-EC à la configuration NGINX a résolu ce problème pour moi. Je suis passé à la configuration suivante dans l’écouteur HTTPS de nginx.conf:

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

Je voudrais laisser tomber tous les chiffrements DHE non-EC et ne supporter que ECDHE. Je soupçonne que cela corrige le problème car je génère une clé / un certificate RSA au lieu d’une clé / d’un certificate EC. Si quelqu’un sait comment générer correctement une clé / un certificate EC, puis extraire correctement la clé publique EC pour le télécharger sur AWS, veuillez améliorer ma réponse. J’ai tenté de générer une clé / un certificate EC, mais lorsque j’essaie de créer la stratégie de clé publique ELB, AWS la signale comme une clé publique non valide.