当前位置: 首页 > 知识库问答 >
问题:

Pivotal CloudFoundry:实施HTTPS(SSL)

东郭赞
2023-03-14

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

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

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

那么,有没有一些选项可以告诉云基金会为应用程序强制实施HTTPS?如果不是,这不应该是一个功能请求吗?而且,今天有什么好方法可以做到这一点呢?

更新:Cloud Foundry或Spring Security团队的你们中有人看到这篇文章吗?我认为这是在CloudFoundry上托管应用程序之前的一个基本特性。在谷歌上,我找到了一个简单的解决方案,就是告诉用户使用https而不是http。但是,即使我这么说,当一个匿名用户试图访问一个受限页面时,Spring Security会将他重定向回http登录页面。

更新2:当然,正如许多答案所建议的那样,我们有x转发的原型标头,但我不知道自定义Spring Security的功能以使用它有多难。然后,我们还有其他事情,比如Spring社交与Spring安全相结合,我刚刚在那里也遇到了一个问题。我认为要么Spring Security和其他大量其他框架需要拿出使用x转发原型的解决方案,要么CloudFoundry需要有某种方式来透明地处理它。我认为后者会很方便。

共有3个答案

薛华奥
2023-03-14

负载平衡器转发的请求将有一个名为< code>x-forwarded-proto的http头,该头被设置为< code>https或< code>http。您可以使用它来影响应用程序在SSL终止方面的行为。

江瀚昂
2023-03-14

您需要检查< code>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 克隆 https://hub.jazz.net/git/jsloyer/sslcheck

该应用程序正在http://sslcheck.mybluemix.net和https://sslcheck.mybluemix.net.运行

徐智渊
2023-03-14

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

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

如果您将web应用程序部署为JAR文件,但是使用不同的框架或嵌入式容器,您需要查找您的框架/容器的文档,看看它是否自动处理x-forwarded-*头。如果没有,你需要手动处理,就像其他答案建议的那样。

 类似资料:
  • 问题内容: 我尝试实现冒泡排序,但是不确定它是否正确。如果您可以看一下它,并且它是气泡式的,并且可以通过更好的方式完成,请不要害羞。这是代码: 问题答案: 这是冒泡排序的正常实现,似乎还可以。可以进行几种优化,但是总体思路是相同的。这里有一些想法: 如果在内循环中未执行任何交换时,外循环有一个迭代,则中断,无用继续 在外循环的每次迭代中,交换内循环的方向-从左至右执行一次,然后从右至左执行一次(这

  • 问题内容: 海 我想建立一个包含聊天的网站。我正在使用PHP,我想要一个代码来实现与php的聊天。有人可以帮助我做到这一点吗?我知道阿贾克斯。我不懂其他语言… 问题答案: 我们目前正在与LiveZilla合作,这非常好,这是公司唯一必须拥有Windows PC的东西。操作员界面位于“ .NET”上 livezilla

  • 有人能解释一下为什么我的启动/停止按钮不起作用吗?这不是一个完整的秒表,但我被困在这里。感谢您的帮助!这是我第一次在论坛上发帖,所以如果我的帖子有任何问题,请告诉我。这是我的代码:

  • 我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”

  • Storm 使用 CGroup 来限制 worker 的资源使用, 以保证公平和 QOS. 请注意:CGroups 目前仅支持 Linux 平台(内核版本 2.6.24 及更高版本) 设置 要使用 CGroups, 请确保正确安装 cgroups 并配置 cgroup.有关设置和配置的更多信息, 请访问: https://access.redhat.com/documentation/en-US/

  • 问题内容: 我的快速搜索显示了参考实现(http://stax.codehaus.org),Woodstox实现(http://woodstox.codehaus.org)和Sun的SJSXP实现(https://sjsxp.dev.java.net / )。 请评论它们的相对优点,并让我介绍我应考虑的任何其他实现。 问题答案: 伍德斯托克斯为我赢得了每一次胜利。这不仅是性能,而且-sjsxp抽搐