ELB Https com HTTP no backend usando o Tomcat sem nginx ou haproxy

1

Eu quero configurar o ELB para encerrar o SSL no balanceador de carga e se comunicar com instâncias de back-end por HTTP. Eu carreguei um certificado válido no ELB. Quando configuro seguindo a configuração

ELB - HTTPS

Back end - HTTP

Em seguida, se o aplicativo executar o redirecionamento no aplicativo, o cliente / navegador será redirecionado para HTTP em vez de HTTPS.

Embora, se eu definir o ELB para usar HTTPS e instâncias de back-end também em HTTPS (mesmo usando certificado auto-assinado), tudo funcionará bem, já que ambas as configurações estão em HTTPS!

Estou usando o Tomcat em instâncias de back-end e não quero usar nenhuma outra camada entre elas (por exemplo, nginx ou haproxy)

    
por code13 29.04.2015 / 13:47

4 respostas

3

Eu encontrei este artigo que parece bastante semelhante ao seu problema: link

Basicamente afirma em mudar server.xml para isso:

<Connector
    port="8080"
    protocol="HTTP/1.1"
    proxyPort="443"
    scheme="https"
    secure="true"
    proxyName="myapp.example.com"
    connectionTimeout="20000"
    URIEncoding="UTF-8"
    redirectPort="8443" />
    
por 29.04.2015 / 15:56
2

Eu tive um tempo difícil encontrar isso na net e, finalmente, eu encontrei uma maneira de fazê-lo.

O problema foi que assim que http redirecionado para https port no ELB internamente ele era redirecionado para a porta 80, criando um loop. Isso acontece porque o ELB descarrega o SSL e, em seguida, se conecta à porta 80 novamente.

Finalmente, após algumas pesquisas, obtive a regra de reescrita correta para gerenciar o X-Forwarded-Proto de tal forma que, mesmo se o ELB descarregar o tomcat SSL, o pedido de origem estava usando SSL.

Isso é feito usando o Tomcat Valves no Tomcat 8. Tenho certeza de que isso pode ser feito em versões anteriores também. Eu habilitei reescrever regras no Tomcat usando válvulas. Depois disso, foi tão simples quanto escrever regras de redirecionamento no Apache.

Aqui estão os passos:

Etapa 1: uma. Abra o context.xml na pasta conf do tomcat b. Cole a seguinte linha logo abaixo

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

Nota: Isso ativará a válvula globalmente. Caso isso precise ser ativado para um host específico, ele deve ser colado dentro do server.xml para esse domínio específico

Etapa 2:

a. Abra conf / server.xml b. Cole a seguinte linha acima de </Host> tag

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

Etapa 3:

a. Abra a pasta onde o web.xml está. Por exemplo, se a aplicação estiver hospedada em ROOT, então web.xml estará sob webapps / ROOT / WEB-INF

b. Da mesma forma, se o aplicativo estiver hospedado em webapps / myappfolder, o web.xml estará sob webapps / myappfolder / WEB-INF

c. Na pasta WEB-INF Crie um novo arquivo rewrite.config . e cole a seguinte regra de reescrita:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
    
por 02.10.2016 / 13:22
1

As regras rewrite.config na resposta de Ravi não funcionaram para mim. Usando o Tomcat 8.0.32, o AWS ELB e o EC2, minhas regras são:

# bounce all requests coming in on HTTP to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

BTW: lembre-se que os redirecionamentos HTTP com 301s são armazenados em cache no navegador e, se funcionar uma vez, você não verá o trabalho novamente até se livrar do redirecionamento em cache do navegador

    
por 09.01.2017 / 00:15
0

Esta pode ser uma pergunta antiga, mas foi difícil encontrar a resposta. Existem dois problemas aqui 1. O contêiner da web do Tomcat está recebendo solicitações em http, de modo que os redirecionamentos que ele construiria seriam os mesmos. Spring ajuda até certo ponto, mas fica aquém. 2. Redirecionando o usuário para HTTPS, mesmo se eles estão tentando acessar HTTP

O segundo problema é fácil, pois o ELB envia essa informação no cabeçalho. Isso pode ser feito adicionando um código simples nos filtros existentes ou em um novo

String protocol =req.getHeader("X-Forwarded-Proto");
    if(protocol!=null && "http".equalsIgnoreCase(protocol)){
        rep.sendRedirect( req.getRequestURL().toString().replaceFirst("http", "https"));
        return;
    }

Para o primeiro problema, uma das soluções que funcionou para mim foi adicionar propriedade adicional (redirectHttp10Compatible) no resolvedor de visões para o servlet de mola.

<bean id="tilesviewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">

    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
    <property name="redirectHttp10Compatible" value="false" />
 </bean>

A vida era boa se apenas os redirecionamentos fossem problemas na primavera, mas como o problema é com o próprio container, era necessário mais ajuda. A solução final é manipular o server.xml e adicionar uma propriedade RemoteIpValve para o mecanismo do tomcat JavaDoc para RemoteIpValve

Esse foi o conserto final. Espero que ajude.

    
por 20.04.2016 / 07:46