4

У меня есть AWS Elastic Load Balancer с сертификатами для моего домена и который завершает трафик SSL. У ELB есть слушатель на порту https и пересылает его как http в Zuul.Zuul за AWS ELB над HTTPS/SSL

Когда я использую Spring Boot HATEOAS, Zuul заменит ссылки с правильным адресом, но с http вместо https:

"_links": { 
    "self": { 
    "href": "http://my.domain.com:80/rest/foo/bar" 
    } 
} 

но то, что я хочу это:

"_links": { 
    "self": { 
    "href": "https://my.domain.com/rest/foo/bar" 
    } 
} 

Запрос, который генерирует этот ответ делается на https

Потому что Zuul is за ELB я предполагаю, что он не может знать, что он должен получать трафик через https.

Есть ли способ сообщить Zuul, чтобы заменить ссылки на https, хотя он получает незашифрованный трафик через http?

Я предполагаю, что альтернатива заключается в развертывании Zuul с https с самозаверяющим сертификатом, но я бы предпочел бы избежать этого осложнения, если смогу.

+0

см https://github.com/spring- облако/весна-облако-Netflix/вопросы/1286 – phoenix7360

ответ

1

В соответствии с рекомендацией от Zuul команды, эта проблема может быть исправлена ​​путем добавления pre Zuul фильтр, который будет применен после PreDecorationFilter (порядка 5):

new ZuulFilter() { 
     @Override 
     public String filterType() { 
      return "pre"; 
     } 

     @Override 
     public int filterOrder() { 
      return 6; //PreDecorationFilter=5 + 1 
     } 

     @Override 
     public boolean shouldFilter() { 
      return true; 
     } 

     @Override 
     public Object run() { 
      RequestContext ctx = RequestContext.getCurrentContext(); 
      log.info(String.format("Before filter ['%s': '%s', '%s': '%s']", 
        ZuulHeaders.X_FORWARDED_PROTO.toLowerCase(), 
        ctx.getZuulRequestHeaders().get(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase()), 
        "X-Forwarded-Port", 
        ctx.getZuulRequestHeaders().get("x-forwarded-port"))); 


      final String originalXForwardedProto = ctx.getRequest().getHeader(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase()); 
      final String originalXForwardedPort = ctx.getRequest().getHeader("x-forwarded-port"); 

      if (!StringUtils.isEmpty(originalXForwardedProto)) { 
       ctx.addZuulRequestHeader(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase(), originalXForwardedProto); 
      } 

      if (!StringUtils.isEmpty(originalXForwardedPort)) { 
       ctx.addZuulRequestHeader("x-forwarded-port", originalXForwardedPort); 
      } 

      log.info(String.format("After filter ['%s': '%s', '%s': '%s']", 
        ZuulHeaders.X_FORWARDED_PROTO.toLowerCase(), 
        ctx.getZuulRequestHeaders().get(ZuulHeaders.X_FORWARDED_PROTO.toLowerCase()), 
        "X-Forwarded-Port", 
        ctx.getZuulRequestHeaders().get("x-forwarded-port"))); 

      return null; 
     } 
    }; 
}