Перенаправить HTTP на HTTPS с помощью App Engine Flex Custom Rumtime и Tomcat - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть приложение, которое я запускаю в App Engine Flex Custom Runtime. Это приложение представляет собой пакет Java WAR, который запускается поверх tomcat 8 (java 8). Для запуска в App Engine Flex Custom Runtime я создал docker образ:

FROM tomcat:alpine
USER root

WORKDIR /root

RUN rm -rf /usr/local/tomcat/webapps/*

COPY ROOT.war /usr/local/tomcat/webapps/ROOT.war
#RUN chmod +x /root/env.sh

RUN rm -f /usr/local/tomcat/conf/server.xml
RUN rm -f /usr/local/tomcat/conf/web.xml

COPY app.jks /usr/local/tomcat/conf/app.jks
COPY server.xml /usr/local/tomcat/conf/server.xml
COPY web.xml /usr/local/tomcat/conf/web.xml


#Set properly time zone
RUN apk --update add tzdata && \
cp /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime && echo "America/Sao_Paulo" > /etc/timezone && \
apk del tzdata

Я прочитал, что при использовании flex и настраиваемой среды выполнения невозможно настроить механизм приложения для перенаправления, это нужно сделать в моем приложение, поэтому я изменил сервер. xml и web. xml из моего кота следующим образом:

server. xml:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />
    <Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="/usr/local/tomcat/conf/app.jks" keystorePass="my_password"
           clientAuth="false" sslProtocol="TLS"/>

web. xml:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Secured</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

и мой app.yaml:

runtime: custom
env: flex
network:
  session_affinity: true
  forwarded_ports:
    - 443:8443
    - 80:8080
resources:
  cpu: 1
  memory_gb: 2
  disk_size_gb: 10
manual_scaling:
  instances: 1
beta_settings:
  cloud_sql_instances: path-db

Кажется, что есть что-то между моим приложением и "inte rnet", потому что каждый раз, когда я пытаюсь получить к нему доступ, он продолжает зацикливаться, как если бы он достигал моего docker контейнера, это всегда HTTP, а не HTTPS Кто-то может определить, в чем моя ошибка? Почему я не могу сделать это перенаправление с помощью движка приложения?

Когда я тестирую его локально с помощью docker на моей машине, все идет гладко.

Заранее спасибо!

1 Ответ

1 голос
/ 27 февраля 2020

В App Engine Flexible вы должны использовать Strict-Transport-Security для принудительной установки HTTPS-соединений. Выполните следующие шаги:

1) Добавьте следующий фильтр в ваш веб. xml:

<filter>
    <filter-name>HTTPSFilter</filter-name>
    <filter-class>security.HTTPSFilter</filter-class>
</filter>

2) Создайте фильтр в своем приложении, чтобы использовать Strict- Transport-Security header:

package security;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

public class HTTPSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) res;

        if (!req.isSecure()) # if it's not secure, make it secure
            resp.setHeader("Strict-Transport-Security", "max-age=31622400; includeSubDomains");

        chain.doFilter(req, resp);
    }
}

Пожалуйста, дайте мне знать, если это работает для вас.

...