Apache VirtualHost com mod-proxy e SSL

24

Estou tentando configurar um servidor com vários aplicativos da web, que serão todos servidos por meio do apache VirtualHost (o apache está sendo executado no mesmo servidor). Minha principal restrição é que cada aplicativo da web deve usar criptografia SSL. Depois de pesquisar por um tempo e observar outras questões no stackoverflow, eu escrevi a seguinte configuração para o VirtualHost:

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

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

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

Embora o link esteja acessível, link não é, o que anula o propósito da minha configuração de host virtual. O Firefox reclama que, embora tenha se conectado com sucesso ao servidor, a conexão foi interrompida. Eu também recebo o seguinte aviso no error.log do apache:

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

No aplicativo da Web (um servidor Tomcat), o log de acesso mostra uma solicitação de acesso estranha:

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

A seguir, temos o acesso correto que recebo quando me conecto diretamente ao link :

"GET / HTTP/1.1" 302

Finalmente, devo mencionar também que o host virtual funciona perfeitamente quando não uso SSL.

Como posso fazer isso funcionar?

    
por JMD 14.06.2009 / 08:17

7 respostas

31

Por fim, encontrei uma maneira de fazer isso funcionar. Primeiro tentei a sugestão de Dave Cheney, então instalei um outro certificado para o servidor apache redirecionado para a porta não SSL do Tomcat (então o proxy estava redirecionando para o link ). Infelizmente, não funcionou como no navegador da Web, o https foi transformado em http imediatamente após a conexão. Então, voltei a usar o link e o toque final para fazê-lo funcionar foi adicionar novamente o SSLProxyEngine.

Aqui está a configuração resultante do VirtualHost:

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

Obrigado pela ajuda de todos:)

    
por 14.06.2009 / 16:25
4

Tente esta configuração

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

Se o seu aplicativo precisar ter acesso às informações SSL da conexão com proxy, você deve considerar o uso de mod_proxy_ajp e o conector ajp1.3 do tomcat.

    
por 14.06.2009 / 14:36
2

Mas, se você deseja executar vários aplicativos da Web habilitados para ssl no mesmo servidor. adicionar o apache na frente não vai equilibrá-los usando sua configuração acima, você ainda precisaria de um balanceador de carga ou você poderia usar o módulo balanceador de proxy do apache com algo como o seguinte:

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
    
por 15.06.2009 / 00:02
1

Bem, o que eu não entendo aqui é por que você precisa ter uma conexão SSL do seu apache para o seu aplicativo que parece estar na mesma máquina ( link .

Eu acho que a maneira usual de configurar coisas como essa é ter o apache fornecendo criptografia SSL para o lado "cliente", por exemplo, Internet e ter uma conexão não criptografada com o aplicativo. Isso também lhe dá mais liberdade para depurar suas respostas de aplicativos.

A outra coisa que Dave Cheney mencionou é usar o conector nativo do tomcat para ter balanceamento de carga e outros recursos.

    
por 14.06.2009 / 15:33
0

Você realmente precisa fazer proxy para um serviço HTTPS? Você pode querer fazer proxy para o serviço não-ssl no host local, por exemplo,

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
    
por 14.06.2009 / 08:33
0

Primeiro, eu verificaria se você pode fazer um pedido de localhost para localhost: 8443 e ver se isso é bem sucedido (ou seja, fazer um get ou wget link )

Eu não tenho certeza do porque você está tendo um host virtual escutando na porta 443, em seguida, fazendo proxy para outro host SSL

por que o aplicativo não pode usar apenas 443 nativamente? se você não pode mudar você pode usar o iptables para redirecionar a porta

    
por 14.06.2009 / 08:34
0

Verifique seu log de erros de SSL e verifique se não há erros sobre a impossibilidade de verificar a cadeia de certificados da autoridade de certificação.

    
por 14.06.2009 / 11:40