2

我将 Amazon ElasticBeanstalk 用于我的 Java EE Web 应用程序部署。我希望我的应用程序应该只是 https,所以我已经在 ElasticLoadbalancer 上配置了 SSL 证书。我也将 web.xml 文件配置为

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

但问题是当我点击http://www.myweb.com然后它重定向到http://www.myweb.com:8443所以我想从 url 中删除端口 Amazon EBS & 负载均衡器的工作解释如下 在此处输入图像描述

在此处输入图像描述

4

3 回答 3

2

我还在我的 web.xml 中添加了 securityConstraint。使用 EB 与您的应用程序一起部署的库存 server.xml,您可以重定向到端口 8443。您可以手动编辑此文件,但它会在您的下一次部署中被吹走。研究建议在部署战争中包含一个 .ebextensions 文件,该文件将覆盖 server.xml 文件,但这会冒 AWS 将来更改 server.xml 中其他内容的风险。另一个问题是我希望相同的应用程序版本(从 jenkins 构建)在我的开发环境以及其他不一定需要/启用 ssl 的 EB 环境中工作。

所以我改变了路线并实现了一个 servlet 过滤器,它使用负载均衡器提供的两个标头

  • X-Forwarded-Proto
  • x-转发主机

如果 X-Forward-Proto == http 那么你知道你需要转发,需要 x-forward-host 来构造完整的 url 以进行重定向(至少我最终是这样做的)。这是使用客户 PropertiesHelper 对其进行环境特定控制的过滤器

public class RedirectFilter implements Filter {
    boolean firstTime = true;
    boolean redirect = false;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException
    {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (firstTime) {
            PropertiesHelper propertiesHelper = SpringApplicationContext.getPropertiesHelper();
            redirect = propertiesHelper.getBooleanProperty("redirectHttp");
            firstTime = false;
        }

        if (!redirect) {
            chain.doFilter(request, response);
            return;
        }

        String protocol = req.getHeader("X-Forwarded-Proto");
        if (null != protocol && protocol.equals("http")) {
            String host = req.getHeader("x-forwarded-host");
            String requestURI = req.getRequestURI();
            String redirectUrl = "https://" + host + requestURI;

            res.sendRedirect(redirectUrl);
            return;
        }
        chain.doFilter(req, response);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }
}

您使用 web.xml 中的条目启用过滤器,确保它与您拥有的其他过滤器的顺序正确

<filter>
    <filter-name>httpsRedirectFilter</filter-name>
    <filter-class>com.cars.platform.util.RedirectFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>httpsRedirectFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

最后,您需要在负载均衡器上同时启用 http 和 https(端口 443)

于 2014-05-08T22:23:57.420 回答
1

如果我理解正确,您只希望弹性负载均衡器使用标准 HTTPS 端口 443,而不是额外配置端口 8443?

这很容易通过单击您提供的第一个图像的侦听器表中的Action列中的Remove按钮来实现。整个过程,包括通过不同方式实现相同目标的选项,也在从负载均衡器中删除侦听器中进行了详细说明:

以下部分包含使用 AWS 管理控制台、命令行界面 (CLI) 或查询 API 从现有负载均衡器的指定端口删除侦听器的说明。在此示例中,您从负载均衡器 MyLoadBalancer 的端口 80 中删除了一个侦听器。

于 2012-11-06T10:19:16.053 回答
0

我遇到了同样的问题,尝试谷歌搜索但没有运气,最后我得到了答案。

在一切顺利之前,我有以下端口重定向设置:

redirect 192.168.1.177:80 to 127.0.0.1:8080  
redirect 192.168.1.177:443 to 127.0.0.1:8443

在 web.xml 中有这样一段代码:

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

当我访问http://192.168.1.177/时,Tomcat 将请求重定向到https://192.168.1.177:8443/https://192.168.1.177/我预期不同的请求。

我发现server.xml中有一个redirectPort元素的属性,当我尝试设置HTTP连接器的to时,<Connector/>redirectPort443

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="443"/>

然后在重新启动 Tomcat 后,瞧,它可以工作了。

于 2016-11-24T14:46:45.410 回答