Tomcat atrás de Apache: Usando SSL com j_security_check
-
12-09-2019 - |
Pergunta
Eu tenho um pequeno problema com o uso de SSL em um Tomcat que está atrás de Apache. Eu tenho usado Google durante toda a manhã para tentar encontrar uma solução boa, mas nada até agora.
Como uma parte da minha configuração SSL VirtualHost Tenho
<Location /MyApp/>
ProxyPass http://localhost:8080/MyApp/
</Location>
Esta muito bem para a maioria dos casos, mas j_security_check funciona, após um login bem-sucedido de https://mysite.com/MyApp , redireciona para uma página HTTP http://mysite.com/MyApp/secret.html em vez de deixá-lo como uma página HTTPS https://mysite.com/MyApp/secret.html . Não é apenas o início de sessão que é confidencial, mas os dados que estão sendo transmitidos, então eu preciso para mantê-lo HTTPS. Quando eu adicionar à segurança-contraints do aplicativo
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
https://mysite.com:8443/MyApp/secret.html . Eu percebo que ele redireciona para 8443 porque server.xml tem SSL configurado para 8443, mas já que esta é proxy através do Apache, ele deve de fato ser 443.
Eu percebo que não têm ProxyPassReverse, mas isso não é algo que eu possa adicionar dentro de uma seção do arquivo de configuração do Apache
Como posso forçar j_security_check a qualquer redirecionamento relativa (por isso não mudar https para http) ou redirecionar para 443 em vez de 8443? Isto é algo que deve fazer cumprir via mod_proxy do Tomcat ou Apache?
Felicidades
Nik
Solução
Você não pode realmente contar com Tomcat para fazer o redirecionamento para SSL para sua configuração. Você precisa escrever um filtro para fazer o redirecionamento si mesmo.
Para a sua configuração específica, que poderia funcionar se você adicionar redirectPort assim,
<Connector ... port="8080" redirectPort="443"/>
Por favor, remova o conector HTTPS. Ele pode confundir alguma versão do Tomcat quando você tem tanto redirectPort e HTTPS conector. Parece que você não quer que as pessoas acessem o seu porta HTTPS de qualquer maneira.
Isso só funciona quando você tem o Apache e Tomcat na mesma máquina. Em um ambiente de produção, que pode não ser o caso.