【问题标题】:Redirect HTTP to HTTPS with App Engine Flex Custom Rumtime and Tomcat使用 App Engine Flex 自定义 Rumtime 和 Tomcat 将 HTTP 重定向到 HTTPS
【发布时间】:2020-02-26 22:30:31
【问题描述】:

我有一个在 App Engine Flex Custom Runtime 上运行的应用程序。这个应用程序是一个运行在 tomcat 8 (java 8) 之上的 Java WAR 包。为了在 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 和自定义运行时不可能将应用引擎配置为重定向,这必须在我的应用程序中完成,所以我修改了我的 tomcat 中的 server.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

似乎我的应用程序和“互联网”之间存在某些东西,因为每次我尝试访问它时,它都会一直循环,就好像当它到达我的 docker 容器时它总是 HTTP 而不是 HTTPS。 有人可以发现我的错误是什么?为什么我无法使用应用引擎执行此重定向?

当我在我的机器上使用 docker 在本地测试它时,一切都很顺利。

提前致谢!

【问题讨论】:

    标签: google-app-engine ssl tomcat https google-cloud-platform


    【解决方案1】:

    在 App Engine Flexible 中,您必须使用 Strict-Transport-Security 来强制使用 HTTPS 连接。请按照以下步骤操作:

    1) 在您的 web.xml 中添加以下过滤器:

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

    2) 在您的应用中创建一个过滤器以使用 Strict-Transport-Security 标头:

    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);
        }
    }
    

    如果它适合你,请告诉我。

    【讨论】:

    • 很抱歉回复晚了,但它的作用就像一个魅力!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    相关资源
    最近更新 更多