我最近将一个微服务后端迁移到Spring boot v2.6.1 + Spring cloud v2021.0.0(旧版本是v2.2.1.RELEASE)。
以前,设置包括一个发现服务器(Eureka),一个网关(Zuul)和通过网关可从外部访问的各种微服务。所有这些都启用了TLS/安全端口,因此所有请求(发现,注册,网关转发等)都需要SSL信任存储配置。
由于这个版本不再支持Zuul,所以我改用Spring云网关,使用下面的应用程序。属性设置:
server.port = 8080
eureka.instance.securePortEnabled=false
eureka.client.serviceUrl.defaultZone = http://localhost:8761/eureka/
spring.application.name= gateway-service
spring.cloud.gateway.routes[0].id=first-service
spring.cloud.gateway.routes[0].uri=lb://FIRST-SERVICE
spring.cloud.gateway.routes[0].predicates[0].name=Path
spring.cloud.gateway.routes[0].predicates[0].args.pattern=/firstService/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
security.require-ssl=true
server.ssl.key-store=keystore.p12
server.ssl.key-store-password=password
server.ssl.keyStoreType=PKCS12
server.ssl.keyAlias=localhost
spring.cloud.gateway.httpclient.ssl.trustedX509Certificates[0]=cert.pem
如果没有普遍禁用ssl,我可以通过该网关访问第一个服务URL而不会出现问题。启用SSL后,我可以直接访问第一个服务,同样没有问题:
https://localhost:8100/test
{"message"; "}
但是,网关没有通过正确的协议或使用正确的客户端证书正确转发请求。我得到下面的错误响应,而不是"Hello World"信息:
https://localhost:8080/firstService/test
错误请求主机和端口的组合需要TLS。
(值得注意的是,Eureka安全端口被禁用,注册/注册表获取是通过HTTP完成的,这是由于错误记录的问题,通过覆盖DiscoveryClient为Eureka Discovery客户端设置自定义信任存储。DiscoveryClientOptionalArgs
好了,这就归结为微服务如何在Eureka中注册了。
虽然FIRST-SERVICE也设置了security.require-ssl=true
直接访问,但也有必要在启用SSL的Eureka注册。
将以下设置添加到应用程序中。属性修复了该问题,而无需对网关配置进行任何更改:
eureka.client.tls.enabled=true
eureka.client.tls.key-store=file:<path-to-key-store>
eureka.client.tls.key-store-password=<password>
eureka.client.tls.keyStoreType=PKCS12
eureka.client.tls.keyPassword=<password>
eureka.client.tls.trust-store=file:<path-to-trust-store>
eureka.client.tls.trust-store-password=<password>