Prise en charge des TLS/HTTPS bidirectionnels avec ELB

Un moyen (ou côté serveur) TLS/HTTPS avec Amazon Elastic Load Balancing est bien documenté

le Support des TLS/HTTPS bidirectionnels (ou côté client) n'est pas aussi clair dans la documentation.

en supposant que ELB termine une connexion TLS/HTTPS:

  1. Does ELB support client authentifié
  2. si c'est le cas, est-ce qu'un serveur servi par ELB reçoit un X-Forwarded-* en-tête de identifier le client authentifié par ELB?

ELB prend en charge le transfert TCP de sorte qu'un serveur hébergé EC2 peut établir une connexion TLS/HTTPS bidirectionnelle, mais dans ce cas, je suis intéressé à ce que ELB mette fin à la connexion TLS/HTTPS et identifie le client.

25
demandé sur pd40 2014-01-21 02:56:42
la source

3 ответов

Je ne vois pas comment il pourrait, en mode HTTPS double-ended, parce que L'ELB établit une deuxième connexion TCP vers le serveur de back-end, et en interne il décrypte/crypte la charge utile vers/depuis le client et le serveur... ainsi, le serveur ne verrait pas le certificat client directement, et il n'y a pas d'en-têtes X-Forwarded- * documentés autres que-For,- Proto et-Port.

avec un ELB tournant en mode TCP, par contre, la négociation SSL se fait directement entre le client et serveur avec ELB liant aveuglément les flux ensemble. Si le serveur prend en charge l' PROXY protocole, vous pouvez activez cette fonctionnalité dans L'ELB pour que vous puissiez identifier L'adresse IP et le port d'origine du client sur le serveur, ainsi que le certificat client directement parce que le client négocierait directement avec vous... bien que cela signifie que vous n'êtes plus décharger SSL à L'ELB, qui peut faire partie de la pointe de ce que vous êtes essayez de faire.


mise à Jour:

il ne semble pas qu'il y ait un moyen de faire tout ce que vous voulez faire -- décharger SSL et identifier le client certifié -- avec ELB seule. L'information ci-dessous est présentée "pour ce qu'elle vaut."

apparemment HAProxy a prise en charge des certificats côté client dans la version 1.5, et transmet les informations de certificat dans X- en-têtes. Depuis HAProxy soutient également PROXY protocole via la configuration (quelque chose dans le sens de tcp-request connection expect-proxy)... il semble donc concevable que vous puissiez utiliser HAProxy derrière un ELB en mode TCP, avec HAProxy mettant fin à la connexion SSL et à la redirection les informations IP/port client de ELB (via le PROXY protocole) et l'information du client cert au serveur d'application... ce qui vous permet de maintenir le déchargement SSL.

je parle de cela, car il semble pour être une solution complémentaire, peut-être plus complète que l'une ou l'autre plate-forme seule, et, au moins en 1.4, les deux produits fonctionnent parfaitement ensemble -- J'utilise HAProxy 1.4 derrière ELB avec succès pour toutes les demandes dans ma plus grande plate-forme web (dans mon cas, ELB décharge La SSL -- il n'y a pas de certs client) et il semble être une combinaison solide en dépit de la redondance apparente des équilibres de charge en cascade. J'aime QU'ELB soit la seule chose sur le grand méchant Internet., bien que je n'ai aucune raison de penser que L'HAProxy exposé directement serait problématique en soi. Dans mon application, les ELBs sont là pour équilibrer les HAProxies dans les A / Z (que j'avais initialement prévu d'auto-dimensionner aussi, mais l'utilisation du CPU est restée si faible même pendant notre saison occupée que je n'ai jamais eu plus d'un par zone de disponibilité, et j'ai jamais perdu, et pourtant...) qui peuvent ensuite effectuer un certain filtrage, forwarding, et munging des en-têtes avant de livrer le trafic vers la plate-forme réelle en plus de me donner un peu de journalisation, réécriture, et le contrôle de partage de trafic que je n'ai pas avec ELB à lui seul.

14
répondu Michael - sqlbot 2014-01-21 04:35:14
la source

dans le cas où votre back end peut prendre en charge les connexions HTTPS authentifiées par le client lui-même, vous pouvez utiliser ELB en tant que TCP sur le port 443 pour TCP sur le port que votre back end écoute. Cela fera ELB juste pour renvoyer la requête non cryptée directement à votre extrémité arrière. Cette configuration ne nécessite pas non plus l'installation D'un certificat SSL sur un équilibreur de charge.

mise à jour: avec cette solution, les en-têtes x-forwarded - * ne sont pas définis.

4
répondu scrutari 2016-06-06 12:45:06
la source

vous pouvez passer à une instance simple sur le haricot élastique, et utiliser ebextensions pour télécharger les certs et configurer nginx pour mutual TLS.

Exemple

.ebextensions/setup.config

files:
  "/etc/nginx/conf.d/00_elastic_beanstalk_ssl.conf":
    mode: "000755"
    owner: root
    group: root
    content: |
      server {
        listen 443;
        server_name example.com;

        ssl on;
        ssl_certificate /etc/nginx/conf.d/server.crt;
        ssl_certificate_key /etc/nginx/conf.d/server.key;
        ssl_client_certificate /etc/nginx/conf.d/ca.crt;
        ssl_verify_client on;

        gzip on;

        send_timeout            300s;
        client_body_timeout     300s;
        client_header_timeout   300s;
        keepalive_timeout       300s;

        location / {
          proxy_pass  http://nodejs;
          proxy_http_version  1.1;
          proxy_set_header  Connection "";
          proxy_set_header  Upgrade $http_upgrade;
          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-SSL-client-serial $ssl_client_serial;
          proxy_set_header X-SSL-client-s-dn $ssl_client_s_dn;
          proxy_set_header X-SSL-client-i-dn $ssl_client_i_dn;
          proxy_set_header X-SSL-client-session-id $ssl_session_id;
          proxy_set_header X-SSL-client-verify $ssl_client_verify;

          proxy_connect_timeout   300s;
          proxy_send_timeout      300s;
          proxy_read_timeout      300s;
        }
      }
  "/etc/nginx/conf.d/server.crt":
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      MIJDkzCCAvygAwIBAgIJALrlDwddAmnYMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD
      ...
      LqGyLiCzbVtg97mcvqAmVcJ9TtUoabtzsRJt3fhbZ0KKIlzqkeZr+kmn8TqtMpGn
      r6oVDizulA==
      -----END CERTIFICATE-----
  "/etc/nginx/conf.d/server.key":
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      MIJCXQIBAAKBgQCvnu08hroXwnbgsBOYOt+ipinBWNDZRtJHrH1Cbzu/j5KxyTWF
      ...
      f92RjCvuqdc17CYbjo9pmanaLGNSKf0rLx77WXu+BNCZ
      -----END RSA PRIVATE KEY-----
  "/etc/nginx/conf.d/ca.crt":
    mode: "000400"
    owner: root
    group: root
    content: |
      -----BEGIN CERTIFICATE-----
      MIJCizCCAfQCCQChmTtNzd2fhDANBgkqhkiG9w0BAQUFADCBiTELMAkGA1UEBhMC
      ...
      4nCavUiq9CxhCzLmT6o/74t4uCDHjB+2+sIxo2zbfQ==
      -----END CERTIFICATE-----
0
répondu Miguel Mota 2017-05-04 21:40:52
la source