Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过自动证书管理在Heroku上嵌入Jetty强制HTTPS_Java_Ssl_Heroku_Https_Embedded Jetty - Fatal编程技术网

Java 如何通过自动证书管理在Heroku上嵌入Jetty强制HTTPS

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 Embedded用Java编写的REST应用程序,运行在Heroku环境中。我想强制所有流量通过HTTPS。关于如何实现这一点,有一些很好的答案,例如和。但是,所有答案都要求从文件中读取TLS/SSL证书。我希望使用Heroku的自动证书管理(详细信息),以避免每年证书到期时都要续订证书。使用ACM意味着我无权访问证书文件


有没有办法将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)。最好两个都检查一下?