如何使用自动证书管理强制在Heroku上使用Jetty Embedded进行HTTPS

时间:2017-06-27 22:03:28

标签: java ssl heroku https embedded-jetty

我有一个使用Jetty Embedded用Java编写的REST应用程序,在Heroku环境中运行。我想强制所有流量通过HTTPS。关于如何实现这一点有一些很好的答案,例如this onethis one。但是,所有答案都需要从文件中读取TLS / SSL证书。我想使用Heroku的自动证书管理(详情here),以避免每年到期时更新证书。使用ACM意味着我无权访问证书文件。

有没有办法配置Jetty强制HTTPS而不从文件中读取证书,或者以某种方式仍然可以使用Heroku ACM?

1 个答案:

答案 0 :(得分:1)

您可以使用实现doFilter的servlet过滤器执行此操作:

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

    String protocol = req.getHeader("X-Forwarded-Proto");

    if (protocol.equals("http")) {
        String url = "https://" + req.getServerName() + req.getContextPath() + req.getServletPath();
        if (req.getPathInfo() != null) {
            url += req.getPathInfo();
        }

        System.out.println("Forwarding request to: " + url);
        resp.sendRedirect(url);
    } else {
        System.out.println("Not forwarding protocol: " + protocol);
        chain.doFilter(request, response);
    }
}

这是a complete example using Tomcat,但原则是相同的。