web-dev-qa-db-fra.com

Apache VirtualHost avec mod-proxy et SSL

J'essaie de configurer un serveur avec plusieurs applications Web qui seront toutes servies via Apache VirtualHost (Apache fonctionnant sur le même serveur). Ma principale contrainte est que chaque application web doit utiliser le cryptage SSL. Après avoir googlé pendant un certain temps et examiné d'autres questions sur stackoverflow, j'ai écrit la configuration suivante pour 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>

Même si https://Host.example.org:844 est accessible, https://Host.example.org ne l'est pas, ce qui va à l'encontre de l'objectif de mon hôte virtuel configuration. Firefox se plaint que, même s'il s'est correctement connecté au serveur, la connexion a été interrompue. Je reçois également l'avertissement suivant dans le fichier error.log d'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 

Sur l'application Web (un serveur Tomcat), le journal d'accès affiche une étrange demande d'accès:

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

Voici la demande d'accès correcte que j'obtiens lorsque je me connecte directement à https://Host.example.org:844 :

"GET / HTTP/1.1" 302

Enfin, je dois également mentionner que l'hôte virtuel fonctionne parfaitement bien lorsque je n'utilise pas SSL.

Comment puis-je faire fonctionner cela?

28
JMD

Enfin, j'ai trouvé un moyen de le faire fonctionner. J'ai d'abord essayé la suggestion de Dave Cheney, j'ai donc installé un autre certificat pour le serveur Apache redirigé vers le port Tomcat non SSL (donc le proxy redirigeait vers http: // localhost: 8080 / ). Malheureusement, cela n'a pas complètement fonctionné car dans le navigateur Web, https a été transformé en http immédiatement après la connexion. J'ai donc recommencé à utiliser https: // localhost: 8443 / et la touche finale pour le faire fonctionner était d'ajouter à nouveau SSLProxyEngine.

Voici la configuration VirtualHost résultante:

<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

Essayez cette 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 votre application doit avoir accès aux informations SSL à partir de la connexion proxy, vous devez envisager d'utiliser mod_proxy_ajp et le connecteur Tomcat ajp1.3.

4
Dave Cheney

Mais si votre objectif est d'exécuter plusieurs applications Web activées SSL sur le même serveur. ajouter Apache devant ne va pas les équilibrer en utilisant votre configuration ci-dessus, vous auriez toujours besoin d'un équilibreur de charge ou vous pourriez utiliser le module d'équilibrage de proxy d'Apache avec quelque chose comme ceci:

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

Eh bien, ce que je ne comprends pas ici, c'est pourquoi vous devez avoir une connexion SSL de votre Apache à votre application qui semble être sur la même machine ( http: // localhost: 8443 / ).

Je suppose que la manière habituelle de configurer des choses comme celle-ci consiste à demander à Apache de fournir le chiffrement SSL au côté "client", par exemple Internet et disposer d'une connexion non cryptée à l'application. Cela vous donne également plus de liberté pour déboguer les réponses de votre application.

Dave Cheney a également mentionné l'utilisation du connecteur natif Tomcat afin d'avoir l'équilibrage de charge et d'autres fonctionnalités.

1
zero_r

Avez-vous vraiment besoin d'un proxy vers un service HTTPS? Vous souhaiterez peut-être un proxy vers le service non SSL dans localhost, par exemple.

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

Je voudrais d'abord voir si vous pouvez faire une demande de localhost à localhost: 8443 et voir si c'est réussi (IE faire un GET ou wget http: // localhost: 844 )

Je ne sais pas trop pourquoi votre havin g un hôte virtuel en écoutant sur le port 443 puis en le procurant à un autre hôte ssl

pourquoi l'application ne peut-elle pas utiliser 443 en mode natif? si vous ne pouvez pas le changer, vous pouvez simplement utiliser iptables pour rediriger le port

0
Brendan

Vérifiez votre journal d'erreurs SSL et assurez-vous que vous n'avez aucune erreur concernant l'impossibilité de vérifier la chaîne de certificats CA.

0
Neobyte