Pivotal CloudFoundry:实施HTTPS(SSL)

时间:2015-01-30 01:02:48

标签: spring-security cloudfoundry

我想为Pivotal CloudFoundry上的Spring Boot应用程序强制执行HTTPS,我认为大多数应用程序今天都希望这样。正如我所知,常用的方法是使用

http.requiresChannel().anyRequest().requiresSecure()

但这会导致重定向循环。正如我通过引用this之类的帖子所理解的那样,原因是负载均衡器将https转换回http。这意味着,它必须在负载均衡器级别完成。

那么,是否有一些选项可以告诉CloudFoundry为应用程序强制执行HTTPS?如果没有,这不应该是功能请求吗?而今天有什么好办法呢?

更新:Cloud Foundry或Spring Security团队中有没有人看过这篇文章?我认为这是一个必不可少的功能,然后才能在CloudFoundry上托管应用程序。谷歌搜索,我发现没有简单的解决方案,但告诉用户使用https而不是http。但是,即使我这样说,当匿名用户试图访问受限制的页面时,Spring Security会将他重定向回http登录页面。

更新2 :当然,我们有x-forwarded-proto标题尽可能多的答案,但我不知道自定义Spring Security的功能有多难以使用那。然后,我们还有Spring Social与Spring Security集成的其他东西,我也遇到了一个问题。我认为Spring Security和其他许多框架都需要提供使用x-forwarded-proto的解决方案,或者CloudFoundry需要有一些方法来透明地处理它。我认为后者会很方便。

3 个答案:

答案 0 :(得分:4)

通常,当您将WAR文件推送到Cloud Foundry时,Java构建包将采用该文件并将其部署到Tomcat。这非常有用,因为Java构建包可以为您配置Tomcat并自动包含RemoteIpValve,它可以使用x-forwarded- *头并重新配置您的请求对象。

如果您正在使用Spring Boot并将其作为JAR文件推送,那么您将在应用程序中嵌入Tomcat。由于Tomcat嵌入在您的应用程序中,因此Java构建包无法为环境配置它(即它无法配置RemoteIpValve)。这意味着您需要对其进行配置。可以在here找到使用Spring Boot执行此操作的说明。

如果您将Web应用程序部署为JAR文件但使用不同的框架或嵌入式容器,则需要查找框架/容器的文档,并查看它是否已自动处理x-forwarding - *标题。如果没有,您需要手动处理,就像其他答案所示。

答案 1 :(得分:2)

您需要检查x-forwarded-proto标题。这是一种方法。

public boolean isSecure (HttpServletRequest request) {
    String protocol = request.getHeader("x-forwarded-proto");

    if (protocol == null) {
        return false;
    }
    else if (protocol.equals("https")) {
        return true;
    }
    else {
        return false;
    }
}

此外,我已经创建了一个示例servlet来执行此操作。 https://hub.jazz.net/git/jsloyer/sslcheck

git clone https://hub.jazz.net/git/jsloyer/sslcheck

该应用正在http://sslcheck.mybluemix.nethttps://sslcheck.mybluemix.net开始投放。

答案 2 :(得分:0)

负载均衡器转发的请求会将名为x-forwarded-proto的http标头设置为httpshttp。您可以使用它来影响应用程序在SSL终止方面的行为。