No estoy seguro de entender exactamente cómo funciona haproxy. Tengo un sistema que se compone de pocos servidores con comunicación basada en http. Quiero usar haproxy como equilibrador de carga y algo así como servidor https al mismo tiempo. Debería funcionar de la siguiente manera: el usuario escribe la dirección y haproxy decide: si es http, lo redirecciona a https, si es https, se conecta con el sistema a través de http. Quiero decir que solo el cliente con haproxy debería tener conexión https, pero el haproxy con sistema debería tener http. Aquí está la imagen con la arquitectura descrita:
Escribí el archivo de configuración de haproxy y lo único que obtengo es redirigir de http a https y mostrar el primer sitio; el resto está muerto, porque todas las comunicaciones se ven así:
cliente --(https)--> haproxy --(https)-->sistema
en lugar de
cliente --(https)--> haproxy --(http)-->sistema
¿Es posible crearlo con haproxy?
A continuación se muestra mi archivo de configuración de haproxy:
global
pidfile /var/run/haproxy.pid
log 127.0.0.1 local2 debug
maxconn 2048
tune.ssl.default-dh-param 2048
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
defaults
mode http
option forwardfor
option http-server-close
log global
option httplog
option dontlognull
option forwardfor
option http-server-close
option redispatch
option tcp-smart-accept
option tcp-smart-connect
timeout http-request 10s
timeout queue 1m
timeout connect 5s
timeout client 2m
timeout server 2m
timeout http-keep-alive 10s
timeout check 5s
retries 3
compression algo gzip
compression type text/html text/html;charset=utf-8 text/plain text/css text/javascript application/x-javascript application/javascript application/ecmascript application/rss+xml application/atomsvc+xml application/atom+xml application/atom+xml;type=entry application/atom+xml;type=feed application/cmisquery+xml application/cmisallowableactions+xml application/cmisatom+xml application/cmistree+xml application/cmisacl+xml application/msword application/vnd.ms-excel application/vnd.ms-powerpoint
frontend https-in
bind *:80
redirect scheme https if !{ ssl_fc }
bind *:443 ssl crt /etc/ssl/private/cert.pem
capture request header X-Forwarded-For len 64
capture request header User-agent len 256
capture request header Cookie len 64
capture request header Accept-Language len 64
rspadd Strict-Transport-Security:\ max-age=15768000
option contstats
default_backend share-https
backend share-https
option httpchk GET /share
balance roundrobin
cookie JSESSIONID prefix
server main srv1:9080 cookie main check inter 5000 weight 4
server secondary srv2:9080 cookie secondary check inter 5000 weight 1
Respuesta1
El problema se debió a que el sistema que describí era Alfresco: la aplicación llamada "compartir" tiene CSRFPolicy que bloqueaba https. De acuerdo a estosolución:
- Copie la configuración predeterminada "CSRFPolicy" de:
TOMCAT_HOME/webapps/share/WEB-INF/classes/alfresco/share-security-config.xml
a:
TOMCAT_HOME/shared/classes/alfresco/web-extension/share-config-custom.xml
- Agregue el atributo reemplazar="true":
<config evaluator="string-compare" condition="CSRFPolicy" replace="true">
- Actualizar las propiedadesárbitroyorigencon FQDN (https) del Apache VirtualHost
<referer>https://HAProxyAddress/.*</referer> <origin>https://HAProxyAddress</origin>
Y eso es todo. Esto funciona para mi.