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

Spring云网关未正确转发HTTPS

汪阳飇
2023-03-14

我最近将microservices后端迁移到Spring boot v2.6.1 Spring cloud v2021.0.0(旧版本是v2.2.1.RELEASE)。

以前,设置包括发现服务器(Eureka)、网关(Zuul)和各种可通过网关从外部访问的微服务。所有这些都启用了TLS/安全端口,因此所有请求(发现、注册、网关转发等)都需要SSL信任存储配置。

由于Zuul在这个版本中不再受支持,我将使用以下应用程序切换到Spring cloud gateway。属性设置:

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

共有1个答案

辛渝
2023-03-14

好的,这取决于微服务如何向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>
 类似资料:
  • 我有一个Spring Boot应用程序正在尝试使用Spring Cloud Gateway访问一些微服务。我使用的代码基于以下位置的说明: 基本上,我的应用程序复制了该站点上提供的代码,包括作者创建的两个测试微服务: 和 我的实际网关代码与作者的类似: package com . betterjavacode . API gateway demo . config; 不幸的是,当我运行此应用程序时

  • 我有一个带有一些endpoint的anexo API,比如: 如何将Spring Cloud Gateway与这些endpoint一起使用?

  • 我正在尝试使用Springboot反应式webclient进行HTTP调用。远程服务器错误导致连接关闭。 请查找以下使用Webclient进行rest调用的代码。 Webclient创建的代码: 第一次通话后,我收到以下日志: 当我在一段时间后(比如10分钟)拨打电话时,连接将变为非活动状态。我正在获取以下日志: 我发现连接没有正确返回到池。配置中是否缺少任何内容?我是否已正确关闭连接?我想这应该

  • 我为所有传入请求创建了全局路由,并使用AbstracTerrorWebExceptionHandler。 我的application.yml 运行应用程序时的日志: 谢谢你的帮助。

  • 我使用的是堆栈下 SpringCloudGatewayHoxton发行版,Java1.8,Linux操作系统 我看到下面的异常在重启后消失,但在一段时间后再次出现。我没有为直接内存做任何显式设置。下面是使用的JVM参数- 有人能告诉我错误的原因吗?

  • 我还需要NGINX来服务静态内容,如JS等,并向后端反向代理请求,还是可以用Spring Cloud Gateway来完成?Spring docs有以下图像: 我没有发现关于如何将静态内容返回给客户端的描述,这是否意味着它被认为是糟糕的做法,我需要额外的反向代理步骤来增加它的延迟?如果没有,我可以在哪里找到更多关于如何使用Spring Cloud Gateway实现这一点的信息,尤其是如果我要使用