Spring Cloud Gateway и Eureka работают в SSL с микросервисами по умолчанию HTTP, но должны быть HTTPS - PullRequest
0 голосов
/ 15 апреля 2020

Используя Spring Boot 2.2.2 и Cloud Hoxton, у меня есть Cloud Gateway с Eureka и несколько экземпляров WebFlux, работающих за шлюзом и обнаруживаемых через Eureka. В режиме HTTP все работает нормально.

При повторной настройке экземпляров Gateway и WebFlux на SSL маршрутизация от шлюза к экземплярам WebFlux все еще работает ОК. Однако микро-службы по-прежнему отправляются как HTTP, а не HTTPS. Я предполагаю, что это так, потому что микро-сервис отказывает с io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record.

Мой шлюз имеет следующую конфигурацию; Редактировать - исправлена ​​конфигурация SSL ниже;

server:
  port: 443
  ssl:
    enabled: true
    key-store: …
    key-store-password: …
    trust-store: …
    trust-store-password: …
eureka:
  client:
    service-url:
      defaultZone: …
  instance:
    securePortEnabled: true
    nonSecurePortEnabled: false
    leaseRenewalIntervalInSeconds: 5
cloud:
    gateway:
      httpclient:
        ssl:
          useInsecureTrustManager: true
     routes:
      - id: route1
        predicates:
          - Path=/SECURITY/**
        uri: lb://SECURITY
        filters:
          - RewritePath=/SECURITY/(?<myPath>.*), /$\{myPath}
          - TokenRelay=
          - RemoveRequestHeader=Cookie

Редактировать: В командной строке для шлюза и микросервиса также есть -Djavax.net.ssl для keyStore, trustStore и соответствующие им пароли.

Микросервис работает на том же сервере с теми же сертификатами и с той же конфигурацией server.ssl и eureka (хотя и с другой spring.application.name)

URL-адреса к шлюзу перенаправляются правильно. Однако приведенный ниже код, который находится в шлюзе, вызывает HTTP вместо вызова HTTPS.

@Configuration
public class LoadBalancedWebClientBuilder {

    @LoadBalanced
    @Bean
    WebClient.Builder loadBalanced() {
        return WebClient.builder();
    }
}

@RestController
public class MyRestController {

  @Autowired WebClient.Builder loadBalanced;

  @GetMapping(value = "/applicationStatus", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
  public Flux<DrsApplication> getApplicationActuator() {
    WebClient webClient = loadBalanced.build();
    return webClient
      .get()
      .uri("lb://SECURITY/drs/application")
      .retrieve()
      .bodyToFlux(DrsApplication.class)
      .filter(p -> p.isActive())
      .flatMap(drsApplication ->
        webClient
          .get()
          .uri("lb://" + drsApplication.getName() + "/actuator/health")
          .retrieve()
          .bodyToMono(ActuatorStatus.class)
          .onErrorReturn(new ActuatorStatus("DOWN"))
          .map(as -> {
            drsApplication.setStatus(as.getStatus());
            return drsApplication;
          })
          .repeatWhen(interval -> Flux.interval(Duration.ofSeconds(4)))
          .onErrorResume(e -> Mono.empty())
      );
  }
}

До сих пор все было обновлено с HTTP до SSL, только с помощью конфигурации. Я предполагал , что, поскольку вызов WebClient использует lb, он автоматически будет следовать за набором и будет принимать SSL.

Верно ли мое предположение или мне нужно изменить свой код или конфигурация

...