Using Spring Boot 2.2.2 and Cloud Hoxton, I have a Cloud Gateway with Eureka and a number of WebFlux instances running behind the Gateway and discoverable via Eureka. In HTTP mode everything works OK.
When re-configuring both the Gateway and WebFlux instances to SSL, the routing from the Gateway to the WebFlux instances is still working OK However micro-services are still being sent as HTTP, not HTTPS. I assume that this is the case since the micro-service is failing with io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record.
My Gateway has the following configuration; Edit - corrected SSL config below;
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
Edit: The command line for both Gateway and micro-service also have -Djavax.net.ssl for keyStore, trustStore and their relevant passwords.
The micro-service is running on the same server with the same certificates and with the same server.ssl and eureka configuration (albeit with a different spring.application.name)
URL calls to the Gateway redirect correctly. However the code below, which resides in the Gateway causes an HTTP instead of an HTTPS call.
@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())
);
}
}
So far everything has been upgraded from HTTP to SSL, just by configuration. I was assuming that because the WebClient call is using lb it would automatically follow suite and adopt SSL.
Is my assumption correct or I do I need to modify my code or configuration?
You are not oblige to set server.forwardHeadersStrategy=NATIVE in your Eureka server. In my case I set eureka.instance.securePortEnabled=true in the target microservice only and in gateway I set lb:// , spring.cloud.gateway.httpclient.ssl.trusted-x509-certificates= cert.pem.
It's not secure to use spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true in the production. This link can help you to know more about gateway and ssl https://cloud.spring.io/spring-cloud-gateway/reference/html/#tls-and-ssl
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With