You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开启SSL后Consul中Gateway服务检查失败求助

问题:Spring Gateway开启SSL后Consul服务检查异常(红色)

问题现象

  • Consul管理页面中「Serf Health Status」显示正常,但「gateway-service」服务检查状态为红色异常
  • 通过Postman发起HTTPS请求可正常执行,直接访问https://XXXX:8080/actuator/health返回状态为"UP"
  • 环境:Consul与Gateway服务均通过Docker镜像部署,使用Docker Compose启动

Gateway配置信息

application.properties

spring.application.name=gateway-service
server.port=8080
spring.cloud.consul.discovery.instanceId=${spring.application.name}-${server.port}-${random.int[1,99]}
spring.cloud.consul.discovery.prefer-ip-address=true
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.consul.config.enabled=false
spring.cloud.consul.host=172.17.0.1
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.scheme=https
server.ssl.enabled=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:keystore/XXXX.p12
server.ssl.key-store-password=XXXX
server.ssl.key-alias=XXXX

Security过滤器配置

@Configuration
public class ResourceServerSecurityConfig {

    @Bean
    public SecurityWebFilterChain configureResourceServer(ServerHttpSecurity httpSecurity) throws Exception {
        return httpSecurity
                .authorizeExchange((exchanges) -> exchanges
                        .pathMatchers("/actuator/health/**").permitAll()
                        .anyExchange().authenticated()
                )
                .oauth2ResourceServer((oauth2) -> oauth2
                        .jwt(Customizer.withDefaults()))
                .build();
    }
}

排查与解决步骤

1. 查看Consul健康检查的具体错误

进入Consul管理页面的服务详情页,查看健康检查的错误日志,确认是SSL证书验证失败、连接超时还是地址不可达等问题,这是定位根源的关键。

2. 解决SSL证书信任问题

如果错误是证书不被Consul信任(比如自签名证书):

  • 测试环境可临时关闭健康检查的SSL验证:
    spring.cloud.consul.discovery.health-check-url=https://[你的Gateway可访问IP/域名]:8080/actuator/health
    spring.cloud.consul.discovery.health-check-verify-ssl=false
    
  • 生产环境需重新生成证书,将Consul访问Gateway时使用的IP/域名添加到证书的**Subject Alternative Name(SAN)**扩展中,确保SSL握手通过。

3. 修正服务注册的地址与健康检查URL

由于配置了prefer-ip-address=true,Gateway会注册容器内部IP,但Consul可能无法通过该IP访问服务:

  • 若Consul和Gateway在同一个自定义Docker网络中,直接使用容器名称作为地址:
    spring.cloud.consul.host=consul # 替换为你的Consul容器名称
    spring.cloud.consul.discovery.health-check-url=https://gateway-service:8080/actuator/health
    
  • 若使用宿主机访问,确保Gateway的8080端口已映射到宿主机,健康检查URL改用宿主机IP+映射端口。

4. 排除Security拦截问题

临时注释掉Security配置,重启Gateway后观察Consul检查状态是否恢复,以此确认是否是Security规则误拦截了健康检查请求。

5. 检查Docker网络连通性

在Consul容器内执行ping gateway-service或curl https://gateway-service:8080/actuator/health,验证网络层面是否存在连通问题。

内容的提问来源于stack exchange,提问作者JorR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 03:05:17