22 votos

Apache VirtualHost con mod-proxy y SSL

Estoy tratando de configurar un servidor con varias aplicaciones web que todos serán atendidas a través de los VirtualHost de apache (apache se ejecuta en el mismo servidor). Mi principal restringir es que cada aplicación web se debe utilizar el cifrado SSL. Después de googlear un rato y buscando otra pregunta en stackoverflow, escribí la siguiente configuración para el VirtualHost:

<VirtualHost 1.2.3.4:443>
    ServerName host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

Aunque https://host.domain.org:8443 es accesible, https://host.domain.org no es, que derrota el propósito de mi configuración del host virtual. Firefox se queja de que a pesar de que ha conectado correctamente con el servidor, la conexión se interrumpe. También tengo la siguiente advertencia en errores de apache.registro:

proxy: no HTTP 0.9 request (with no host line) on incoming request and preserve host set forcing hostname to be host.domain.org for uri

En la web de la aplicación (un servidor Tomcat) el registro de acceso se muestra una extraña solicitud de acceso:

"?O^A^C / HTTP/1.1" 302

Siguiente es la correcta solicitud de acceso que siento cuando voy a conectar directamente a https://host.domain.org:8443:

"GET / HTTP/1.1" 302

Por último debo mencionar también que el host virtual funciona perfectamente bien cuando yo no utiliza SSL.

¿Cómo puedo hacer que esto funcione ?

Gracias

4voto

JMD Puntos 241

Por fin he encontrado una manera de hacer que funcione. Primero traté de Dave Cheney sugerencia, así que he instalado un certificado para el servidor apache redirigido a Tomcat no puerto SSL (para que el proxy se redirigir a http://localhost:8080/). Por desgracia no funcionar completamente como en el navegador web el https se transformó http inmediatamente después de la conexión. Así que he vuelto a usar https://localhost:8443/ y el toque final para hacer que el trabajo era para agregar nuevo SSLProxyEngine.

Aquí está el resultado VirtualHost de configuración:

<VirtualHost 1.2.3.4:443>
    ServerName host.domain.org

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    SSLEngine on
    SSLProxyEngine On
    SSLCertificateFile /etc/apache2/ssl/certificate.crt
    SSLCertificateKeyFile /etc/apache2/ssl/certificate.key

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / https://localhost:8443/
    ProxyPassReverse / https://localhost:8443/
</VirtualHost>

Gracias por ayudar a todo el mundo :)

4voto

Daniel DiPaolo Puntos 24085

Pero si tu objetivo es ejecutar múltiples ssl habilitado aplicaciones web en el mismo servidor. adición de apache en el frente no va a equilibrarlos con tu configuración anterior, todavía necesitaría un equilibrador de carga o usted podría utilizar el módulo de apache proxy balanceador con algo como lo siguiente:

ProxyRequests Off

<Proxy balancer://someapplication>
    BalancerMember http://127.0.0.1:18443 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18444 keepalive=on max=2 retry=30
    BalancerMember http://127.0.0.1:18445 keepalive=on max=2 retry=30
</Proxy>


<VirtualHost 1.2.3.4:443>
    SSLEngine on
    SSLCipherSuite SSLv2:-LOW:-EXPORT:RC4+RSA
    SSLCertificateFile /path/to/cert.pem
    SSLCertificateKeyFile //path/to/key.pem
    SSLVerifyClient optional

    RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
    RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e

<Location />
    SetHandler balancer-manager
    Order allow,deny
    Allow from all
</Location>

ProxyPass / balancer://someapplication:443/
ProxyPassReverse / balancer://someapplication:443/
ProxyPreserveHost on

2voto

Michael Puntos 1

Bien, lo que no entiendo aquí es por qué es necesario tener una conexión SSL de apache para su aplicación, la cual parece estar en la misma máquina (http://localhost:8443/).

Supongo que la forma habitual de establecer este tipo de cosas es tener apache proporciona el cifrado SSL para el "cliente"de lado, por ejemplo, por internet, y tener una conexión sin cifrar a la aplicación. Esto también le da más libertad para depurar su aplicación respuestas.

La otra cosa Dave Cheney mencionado es el uso de los nativos del conector tomcat con el fin de tener el equilibrio de carga y otras características.

0voto

Dave Cheney Puntos 13302

Pruebe esta config

<VirtualHost 1.2.3.4:443>
    ServerName host.domain.org

    SSLEngine On
    # include other ssl options, like cert and key here

    ProxyRequests Off
    ProxyPreserveHost On

    <Location />
        ProxyPass http://localhost:8443/
    </Location>
</VirtualHost>

Si la aplicación necesita tener acceso a la información SSL de la conexión proxy, debe considerar el uso mod_proxy_ajp y el conector ajp1.3 de tomcat.

0voto

codehead Puntos 713

¿Realmente necesita de proxy para un servicio HTTPS? Tal vez quieras proxy para el servicio no ssl en localhost, e.g.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: