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?
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>
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.
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
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.
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/
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
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.