Java 如何通过自动证书管理在Heroku上嵌入Jetty强制HTTPS
我有一个使用Jetty Embedded用Java编写的REST应用程序,运行在Heroku环境中。我想强制所有流量通过HTTPS。关于如何实现这一点,有一些很好的答案,例如和。但是,所有答案都要求从文件中读取TLS/SSL证书。我希望使用Heroku的自动证书管理(详细信息),以避免每年证书到期时都要续订证书。使用ACM意味着我无权访问证书文件Java 如何通过自动证书管理在Heroku上嵌入Jetty强制HTTPS,java,ssl,heroku,https,embedded-jetty,Java,Ssl,Heroku,Https,Embedded Jetty,我有一个使用Jetty Embedded用Java编写的REST应用程序,运行在Heroku环境中。我想强制所有流量通过HTTPS。关于如何实现这一点,有一些很好的答案,例如和。但是,所有答案都要求从文件中读取TLS/SSL证书。我希望使用Heroku的自动证书管理(详细信息),以避免每年证书到期时都要续订证书。使用ACM意味着我无权访问证书文件 有没有办法将Jetty配置为在不读取文件中的证书的情况下强制使用HTTPS,或者以某种方式仍然能够使用Heroku ACM?您可以通过实现doFilt
有没有办法将Jetty配置为在不读取文件中的证书的情况下强制使用HTTPS,或者以某种方式仍然能够使用Heroku ACM?您可以通过实现
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);
}
}
这是一个例子,但原理是一样的。谢谢@codefinger。当使用Chrome时,X-Forwarded-Proto不作为标题包含,所以这对我不起作用。但是,我看到HttpServletRequest.getScheme()似乎正确地识别了我使用的是HTTP还是HTTPS,所以我将尝试这种方法并发布结果。好的,在调查之后发现:HttpServletRequest.getScheme()不可靠(即使在Heroku上使用HTTPS,它也会返回“HTTP”)和HttpServletRequest.isSecure()也不可靠(在Heroku上使用HTTPS时返回false)。X-Forwarded-Proto标头不会发送到本地运行的服务器,但会发送到Heroku上运行的服务器。这个答案是正确的。我相信问题出在w/getScheme上是因为SSL终止发生在Heroku路由器上(因此连接在Servlet上是HTTP)。最好两个都检查一下?