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

当运行在Google前端负载均衡器后面时,如何正确地从Spring Boot2.3重定向到HTTPS

陈刚洁
2023-03-14

我有一个spring boot应用程序通过入口控制器在GKE上运行,带有Google https负载均衡器。我正在寻找的行为是Spring Boot应用程序在收到http请求时重定向到https。在Spring Boot2.2和更早的版本中,我可以通过下面的代码和配置来实现这一点。

我的应用程序yaml中的配置

server:
  port: 8877
  use-forward-headers: true # this should make it understand X-Forwarded-Proto header 
 @Override
  protected void configure(HttpSecurity http) throws Exception {

    /* When the app is running on GKE traffic will come in through the
     * GCP http load balancer. Which will set the X-Forwarded-Proto
     * header to http or https. When the app runs on a dev machine
     * these headers are not set.
     *
     * see https://cloud.google.com/load-balancing/docs/https/
     *
     * The code forces ssl if the x forwarded proto header is present
     * as that indicates the app is online and accessible to the
     * wider internet.
     *
     */
    http.requiresChannel()
        .requestMatchers(r -> r.getHeader("X-Forwarded-Proto") != null)
        .requiresSecure();
   // more stuff  omitted  
 } 
server:
  port: 7777
  forward-headers-strategy: native
  tomcat:
    remoteip:
      protocol-header: "X-Forwarded-Proto"
      remote-ip-header: "X-Forwarded-For"

问题:在Spring Boot2.3上运行的GKE上,通过和入口控制器配置的GCP负载均衡器,从http重定向到https的正确方法是什么?

共有1个答案

白镜
2023-03-14

Spring Boot依赖于Tomcat来评估传入的请求,以确定请求是否应该被认为是“安全的”。Tomcat remote IP valve将查看两位信息以评估请求是否安全。

  1. 向Tomcat发送请求的负载均衡器/代理的ip地址
  2. x-forwarded-protohttp头
  3. 的值

负载均衡器(在tomcat配置中称为内部代理)的ip地址必须在受信任列表中,并且x-forwaded-proto必须是https,tomcat才会认为请求是安全的。否则,将发送重定向。

google负载平衡器正在发送带有x-forwaded-proto:https的请求,但源ip来自google的35.191.0.0/16130.211.0.0/22范围,因此tomcat认为来自GCP负载平衡器的https请求发送回重定向是不安全的。从而导致浏览器抱怨的无限重定向循环。

Spring Boot使用属性server.tomcat.remoteIP.internal-proxies配置tomcat远程ip地址,该属性具有RFC1918中专用ip地址的默认值,使用下面的regex。

10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|192\\.168\\.\\d{1,3}\\.\\d{1,3}|169\\.254\\.\\d{1,3}\\.\\d{1,3}|127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|0:0:0:0:0:0:0:1|::1

Tomcat不知道如何比较ip地址范围,因此必须将google源ip转换为一个正则表达式,这样才能工作。

server:
  port: 7777
  forward-headers-strategy: native
  tomcat:
    remoteip:
      protocol-header: "X-Forwarded-Proto"
      remote-ip-header: "X-Forwarded-For"
      internal-proxies: ".*" # should Java regex to match ip address range of the load balancer servers. Not a best practice to trust all ip addresses. 
 类似资料:
  • 我们目前有一个google云设置,在TCP负载平衡器后面有一个后端服务(一个由3台vm机器组成的托管实例组)。在前端配置中,我们有一个静态外部ip地址,将流量重定向到端口6443,并在连接到负载平衡器的端口6443上进行tcp健康检查。在后端服务中的3个vm实例中,最初只有一台计算机在端口6443上运行服务。因此,负载平衡器在负载平衡器详细信息页面中正确检测到一个运行状况实例和两个不正常实例。为了

  • 我有一个Wordpress网站在AWS EC2实例上运行。这是通过AWS弹性负载平衡器提供的,它使用我从Amazon获得的证书启用了HTTPS。 其目的是为该网站提供http和https版本。加载http版本可以正常工作。 然而,当我加载https版本时,会出现混合内容错误,因为总是返回http链接。负载平衡器的工作方式是TLS终止于LB,并通过端口80与实际EC2实例通信。因此,实例本身上没有H

  • 问题内容: 我正在AWS上运行节点/快速服务,并已在其前面部署了ELB。当我启动启用了SSL的ELB实例时,它适用于我点击的第一页,但之后切换到HTTP以进行每次服务器访问。 ELB上的路由规则终止SSL,并将其转发到正在侦听该节点的端口8080。 SSL终止解决方案可以很好地实现我的目的,但是如何使后续的服务器调用保持在HTTPS上? 问题答案: 我遇到过相同的问题,但背景略有不同。我当时使用A

  • 我在beanstalk和配置的nginx实例上有一个经典的负载均衡器。我想重定向http到https请求。 我设置了负载均衡器侦听器重定向到端口80到它的实例。 我在.ebextensions/nginx_config.config中创建了一个文件,在其中设置重定向并筛选出HealthCheck。 请参阅下面的配置重写: 但似乎什么也没有发生,服务器仍然没有重定向到HTTPS。好像我的配置被忽略了

  • 问题是,我还想将HTTP访问重定向到HTTPS,然后我试图添加一个规则将80重定向到443,因此它将落入第一个规则(443到8080)并使用证书,但它不起作用。在网上研究,我发现我应该在我的。htacess文件中添加一些行,但也不起作用。我认为这不是我的解决方案,因为所有HTTPS的东西都在AWS端,有没有一种方法可以只通过AWS将HTTP重定向到HTTPS而不改变服务器?

  • 我有一个EC2实例,它托管一个在IIS中运行的网站。我还设置了一个带有HTTPS侦听器的AWS应用程序负载平衡器,并在其中添加了网站的SSL证书(保存在AWS证书管理器中)。HTTPS侦听器将流量重定向到我的目标组,目标组又指向我的EC2实例。EC2实例使用安全组只允许来自负载平衡器的流量。 首先,我是否正确地认为应用程序负载平衡器会解密SSL流量,从而使用HTTP将其转发到我的目标组(换句话说,