sviluppo-web-qa.it

Apache VirtualHost con mod-proxy e SSL

Sto cercando di configurare un server con più applicazioni Web che verranno servite tutte tramite Apache VirtualHost (Apache in esecuzione sullo stesso server). Il mio principale vincolo è che ogni applicazione web deve usare la crittografia SSL. Dopo aver cercato su Google per un po 'e aver esaminato altre domande su StackOverflow, ho scritto la seguente configurazione per 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>

Anche se https://Host.example.org:844 è accessibile, https://Host.example.org non lo è, il che vanifica lo scopo del mio host virtuale configurazione. Firefox si lamenta che, nonostante sia stato correttamente collegato al server, la connessione è stata interrotta. Ricevo anche il seguente avviso in error.log di 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 

Nell'applicazione Web (un server Tomcat) il registro di accesso mostra una strana richiesta di accesso:

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

Di seguito è la richiesta di accesso corretta che ottengo quando mi collego direttamente a https://Host.example.org:844 :

"GET / HTTP/1.1" 302

Infine, dovrei anche menzionare che l'host virtuale funziona perfettamente quando non uso SSL.

Come posso farlo funzionare?

28
JMD

Alla fine ho trovato il modo di farlo funzionare. Per prima cosa ho provato il suggerimento di Dave Cheney, quindi ho installato un altro certificato per il server Apache reindirizzato alla porta Tomcat non SSL (quindi il proxy stava reindirizzando a http: // localhost: 8080 / ). Sfortunatamente non ha funzionato completamente poiché nel browser Web l'https è stato trasformato in http immediatamente dopo la connessione. Quindi sono tornato a usare https: // localhost: 8443 / e il tocco finale per farlo funzionare è stato aggiungere nuovamente SSLProxyEngine.

Ecco la configurazione VirtualHost risultante:

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

Prova questa configurazione

<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 l'applicazione deve avere accesso alle informazioni SSL dalla connessione proxy, è consigliabile utilizzare mod_proxy_ajp e il connettore Tomcat ajp1.3.

4
Dave Cheney

Ma se l'obiettivo è eseguire più applicazioni Web abilitate per SSL sullo stesso server. l'aggiunta di Apache in primo piano non li bilancerà usando la configurazione precedente, avresti comunque bisogno di un bilanciamento del carico o potresti usare il modulo di bilanciamento proxy di Apache con qualcosa di simile al seguente:

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

Bene, ciò che non capisco qui è perché è necessario disporre di una connessione SSL da Apache all'applicazione che sembra essere sulla stessa macchina ( http: // localhost: 8443 / ).

Immagino che il solito modo per configurare cose come questa sia avere Apache che fornisce la crittografia SSL al lato "cliente", ad es. Internet e dispone di una connessione non crittografata all'applicazione. Questo ti dà anche più libertà di eseguire il debug delle risposte alle tue applicazioni.

L'altra cosa menzionata da Dave Cheney è l'uso del connettore Tomcat nativo per avere il bilanciamento del carico e altre funzionalità.

1
zero_r

Hai davvero bisogno di fare il proxy per un servizio HTTPS? Potresti voler eseguire il proxy al servizio non ssl in localhost, ad es.

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
0
codehead

Per prima cosa vorrei vedere se è possibile effettuare una richiesta da localhost a localhost: 8443 e vedere se ha esito positivo (IE fa un GET o wget http: // localhost: 844 )

Non sono del tutto sicuro del motivo per cui hai un host virtuale in ascolto sulla porta 443 e poi lo inoltri a un altro host ssl

perché non è possibile utilizzare l'applicazione 443 in modo nativo? se non puoi cambiarlo, puoi semplicemente usare iptables per reindirizzare la porta

0
Brendan

Controlla il registro degli errori SSL e assicurati di non avere errori riguardo l'impossibilità di verificare la catena di certificati CA.

0
Neobyte