0

我正在尝试在我的应用程序中实现 HTTPS。这是一个运行在 8080 端口上的 JHipster/SpringBoot 应用程序。我通过 AWS 实现了 HTTPS,以使事情变得更容易,因为证书可以由 AWS 证书管理器服务自动处理/更新。

所以我没有改变我的服务器上的任何东西。我在 AWS 上生成了一个证书,并配置了一个 LoadBalancer 规则,以使用生成的证书从 443 重定向到 8080。当我尝试使用显式 HTTPS 访问我的域时,它就像一个魅力。

问题是我也想将HTTP访问重定向到HTTPS,然后我尝试添加一个规则将80重定向到443,所以它会落在第一个规则(443到8080)并使用证书,但它没有工作。在线研究我发现我应该在我的 .htacess 文件中添加一些行,但也不起作用。我认为这不是我的解决方案,因为所有 HTTPS 的东西都在 AWS 端,有没有办法仅通过 AWS 将 HTTP 重定向到 HTTPS 而无需更改我的服务器?

4

2 回答 2

1

您需要将到 HTTPS 重定向的 HTTP 流量也视为应用程序的一部分,并适应必要的规则和配置。

例如,您将从打开 PORT 80 (HTTP) 的 ELB 开始,这将由侦听 80 或任何端口的 Web 服务器处理以执行重定向 [单独的侦听器]

如果您使用的是 Apache Web 服务器,则需要以下规则

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

参考 :

  1. http://www.emind.co/how-to/how-to-force-https-behind-aws-elb/
  2. 使用 AWS ELB 将所有 http 流量重新路由到 https
于 2016-10-10T17:51:09.083 回答
1

上面的答案对我不起作用,因为我没有使用这样的文件。我最终做了一个这样的后端过滤器:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HttpToHttpsFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
        // Nothing to destroy
    }

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

        String protocol = httpRequest.getHeader("X-Forwarded-Proto");
        if (protocol != null) {
            if(protocol.toLowerCase().equals("https")) {
                httpResponse.setHeader("Strict-Transport-Security", "max-age=60");
            }
            else if(protocol.toLowerCase().equals("http")) {
                String host = httpRequest.getServerName();
                String requestURI = httpRequest.getRequestURI();
                String redirectUrl = "https://" + host + requestURI;
                httpResponse.sendRedirect(redirectUrl);
                return;
            }
        }

        chain.doFilter(request, response);
    }
}
于 2016-11-28T21:35:10.397 回答