tutorial puerto para instalar elastic configurar certificado balancing balancer balanceador aws ssl amazon-web-services amazon-elb authentication two-way

ssl - instalar - puerto para https



Soporte para TLS/HTTPS bidireccional con ELB (3)

Una forma (o lado del servidor) TLS / HTTPS con Amazon Elastic Load Balancing está bien documentada

El soporte para TLS / HTTPS bidireccional (o del lado del cliente) no está tan claro en la documentación.

Suponiendo que ELB está terminando una conexión TLS / HTTPS:

  1. ¿El ELB soporta conexiones autenticadas de cliente HTTPS?
  2. Si es así, ¿un servidor servido por ELB recibe un encabezado X-Forwarded- * para identificar al cliente autenticado por ELB?

ELB admite el reenvío de TCP, por lo que un servidor alojado en EC2 puede establecer una conexión TLS / HTTPS bidireccional, pero en este caso me interesa que ELB finalice la conexión TLS / HTTPS e identifique al cliente.


No veo cómo podría hacerlo, en el modo de doble extremo HTTPS, porque el ELB está estableciendo una segunda conexión TCP con el servidor de fondo, e internamente está descifrando / encriptando la carga útil del cliente y del servidor ... por lo que el servidor no vería el certificado del cliente directamente, y no hay encabezados X-Reenviados * distintos de -For, -Proto y -Port.

Con un ELB ejecutándose en modo TCP, por otro lado, la negociación de SSL se realiza directamente entre el cliente y el servidor con ELB vinculando ciegamente las secuencias. Si el servidor admite el protocolo PROXY , puede habilitar esa funcionalidad en el ELB para poder identificar la IP y el puerto de origen del cliente en el servidor, así como identificar el certificado del cliente directamente porque el cliente estaría negociando directamente con usted. . aunque esto significa que ya no está descargando SSL al ELB, que puede ser parte del punto de lo que está tratando de hacer.

Actualizar:

No parece que haya una manera de hacer todo lo que quiera hacer: descargar SSL e identificar el certificado de cliente, solo con ELB. La información a continuación se presenta "por lo que vale".

Aparentemente HAProxy tiene soporte para certificados del lado del cliente en la versión 1.5 , y pasa la información del certificado en encabezados X- Dado que HAProxy también es compatible con el protocolo PROXY través de la configuración (algo parecido a la tcp-request connection expect-proxy de tcp-request connection expect-proxy ) ... parece concebible que pueda usar HAProxy detrás de un ELB de modo TCP, con HAProxy terminando la conexión SSL y el reenvío tanto la información de IP / puerto del cliente de ELB (a través del protocolo PROXY ) y el cliente certifican la información en el servidor de aplicaciones ... lo que le permite mantener la descarga de SSL.

Menciono esto porque parece ser una solución complementaria, tal vez más característica completa que cualquiera de las plataformas por sí sola, y, al menos en 1.4, los dos productos funcionan perfectamente juntos - Estoy usando HAProxy 1.4 detrás de ELB con éxito para todas las solicitudes en mi La plataforma web más grande (en mi caso, ELB está descargando SSL - no hay certificados de clientes) y parece ser una combinación sólida a pesar de la aparente redundancia de balanceadores de carga en cascada. Me gusta que ELB sea lo único que existe en el gran Internet malo, aunque no tengo motivos para pensar que HAProxy directamente expuesto sea problemático por sí mismo. En mi aplicación, los ELB están ahí para equilibrar los HAProxies en las A / Z (que originalmente tenía la intención de escalar automáticamente, pero la utilización de la CPU se mantuvo tan baja incluso durante nuestra temporada ocupada que nunca tuve más de uno por Zona de disponibilidad, y nunca he perdido una, aún ...) que luego puede hacer un poco de filtrado, reenvío y corte de encabezados antes de entregar el tráfico a la plataforma real, además de darme algo de registro, reescritura y tráfico -despliegue de control que no tengo con ELB por sí mismo.


En caso de que su back-end pueda soportar las conexiones HTTPS autenticadas por el cliente, puede usar ELB como TCP en el puerto 443 para TCP en el puerto que escucha su back-end. Esto hará que ELB simplemente reenvíe la solicitud no encriptada directamente a su back-end. Esta configuración tampoco requiere la instalación de un certificado SSL a un equilibrador de carga.

Actualización: con esta solución x-reenviado- * los encabezados no están configurados.


Puede cambiar a instancia única en Elastic Beanstalk, y usar ebextensions para cargar los certs y configurar nginx para mutuo TLS.

Ejemplo

.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-----