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

为Spring DiscoveryClient配置SSLContext,解决Eureka证书验证失败问题

解决Eureka Client使用自定义Truststore的SSL验证问题

你已经搞定了OAuth2RestTemplate的SSL配置,但Eureka Client默认的Jersey Client还在使用JDK自带的truststore,这就是服务发现时证书路径验证失败的核心原因。下面是完整配置方案,让Eureka Client复用你的自定义truststore,同时完全不修改JDK默认配置:

步骤1:完善自定义Truststore的加载Bean

先把truststore的加载逻辑封装成可复用的Bean,方便后续Eureka Client和OAuth2RestTemplate共用:

@Bean
public KeyStore trustStore(Environment env) throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException {
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    // 替换为你的truststore路径(比如classpath下的文件)和密码配置
    try (InputStream trustStoreStream = new ClassPathResource("custom-truststore.jks").getInputStream()) {
        trustStore.load(trustStoreStream, env.getProperty("ssl.truststore.password").toCharArray());
    }
    return trustStore;
}

步骤2:自定义Eureka Client的Jersey HTTP客户端

创建自定义的EurekaHttpClientFactory,让Eureka Client使用你的truststore进行SSL验证:

import com.netflix.discovery.DiscoveryClientOptionalArgs;
import com.netflix.discovery.shared.transport.jersey2.Jersey2EurekaHttpClientFactory;
import com.netflix.discovery.shared.transport.jersey2.Jersey2TransportClientFactories;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.ssl.SSLContexts;
import org.glassfish.jersey.SslConfigurator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.net.ssl.SSLContext;
import java.security.KeyStore;

@Configuration
public class EurekaSslConfiguration {

    private final KeyStore trustStore;

    // 注入之前定义的trustStore Bean
    public EurekaSslConfiguration(KeyStore trustStore) {
        this.trustStore = trustStore;
    }

    @Bean
    public Jersey2EurekaHttpClientFactory jersey2EurekaHttpClientFactory() throws Exception {
        // 复用你之前的SSLContext构建逻辑
        SSLContext sslContext = SSLContexts.custom()
                .loadTrustMaterial(trustStore, (x509Certificates, s) -> false)
                .build();

        // 配置Jersey的SSL参数,和OAuth配置保持一致
        SslConfigurator sslConfigurator = SslConfigurator.newInstance()
                .sslContext(sslContext)
                .hostnameVerifier(new NoopHostnameVerifier());

        // 创建自定义的Eureka HTTP客户端工厂
        return Jersey2EurekaHttpClientFactory.create(
                Jersey2TransportClientFactories.newBuilder()
                        .sslConfigurator(sslConfigurator)
                        .build()
        );
    }

    // 将自定义客户端工厂注入Eureka Client配置
    @Bean
    public DiscoveryClientOptionalArgs discoveryClientOptionalArgs(Jersey2EurekaHttpClientFactory httpClientFactory) {
        DiscoveryClientOptionalArgs args = new DiscoveryClientOptionalArgs();
        args.setEurekaHttpClientFactory(httpClientFactory);
        return args;
    }
}

步骤3:验证Eureka地址配置

在application.properties(或yaml)中确保Eureka Server地址使用HTTPS协议:

# Eureka Server HTTPS地址
eureka.client.service-url.defaultZone=https://your-eureka-server:8761/eureka/

# 其他Eureka基础配置
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

方案说明

  • 你的OAuth2RestTemplate已经使用自定义ClientHttpRequestFactory,现在Eureka Client也通过Jersey2EurekaHttpClientFactory复用了同一个truststore,所有HTTPS通信(Eureka、OAuth Server、目标REST服务)都统一使用自定义证书链。
  • 完全不需要修改JDK/JRE默认truststore,符合你的核心需求。
  • SSL配置逻辑统一管理,避免重复代码。

最后确认主配置类已添加@EnableDiscoveryClient注解,重启服务后,Eureka Client就能正常验证证书并完成服务发现了。

内容的提问来源于stack exchange,提问作者shawn oscar ning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:43:19