首页 > 解决方案 > 使用 App Engine Flex 自定义 Rumtime 和 Tomcat 将 HTTP 重定向到 HTTPS

问题描述

我有一个在 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,如下所示:

服务器.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"/>

网页.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-enginessltomcathttpsgoogle-cloud-platform

解决方案


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

请让我知道它是否适合您。


推荐阅读