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

SSL环境中的SpringBoot+Eureka+CloudConfig

琴刚豪
2023-03-14

Eureka Discovery服务器(包括/config/*服务器上的云配置服务)正在向Eureka服务器注册,并且Eureka仪表板显示了该实例。此服务在端口9001上运行,启用SSL并进行用户身份验证。服务照常工作。

然后我创建了一个新的SpringBoot服务,它连接到Eureka并注册到它。由于使用了自签名证书,我在这篇文章中编写了一个小的SSLConfguration类:如何覆盖Spring Cloud Eureka default discovery client默认ssl上下文?将我的个人信任库提供给底层的eurekaclient。我们的所有服务都使用application.yml配置:

spring:
    application:
        name: mark2

server:
    port: 9998
    ssl:
        enabled: true
        key-store: classpath:keystore.p12
        key-store-password: changeit
        key-store-type: PKCS12
        keyAlias: mark2

http:
    client:
      ssl:
          trust-store: classpath:keystore.p12
          trust-store-password: changeit

eureka:
    client:
        serviceUrl:
            defaultZone: https://user:pass@localhost:9001/eureka

客户端完全连接和注册。

spring:
    application:
        name: mark2
    cloud:
        config:
            username: user
            password: password
            discovery:
                enabled: true
                serviceId: EUREKA-DISCOVERY-SERVICE
            failFast: true
            name: my
            profile: settings
#            label: v1

http:
    client:
      ssl:
          trust-store: classpath:keystore.p12
          trust-store-password: changeit

eureka:
    client:
        serviceUrl:
            defaultZone: https://user:password@localhost:9001/eureka
    instance:
        metadataMap:
            user: user
            password: password
            configPath: /config

好的,然后我用javax.net.ssl.truststore等将JVM参数设置为我的个人信任库。

bootRun {
   jvmArgs = [ 
     "-Djavax.net.ssl.trustStore=/absolute/path/to/keystore.p12", 
     "-Djavax.net.ssl.trustStorePassword=changeit", 
     "-Djavax.net.ssl.trustStoreType=PKCS12", 
   ]
}

服务启动,Eureka客户端开始与Eureka服务器通信,查找云配置实例并加载属性文件,然后创建Spring上下文。该属性仅包含一些测试属性。

但是然后-错误:

Field optionalArgs in org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration required a single bean, but 2 were found:
    - getTrustStoredEurekaClient: defined by method 'getTrustStoredEurekaClient' in class path resource [de/mark2/SslConfiguration.class]
    - discoveryClientOptionalArgs: defined by method 'discoveryClientOptionalArgs' in org.springframework.cloud.netflix.eureka.config.DiscoveryClientOptionalArgsConfiguration

共有1个答案

段干昊然
2023-03-14

定义meta-inf/spring.factories,并添加org.springframework.cloud.bootstrap.bootstrapconfiguration=...行

类可以类似于:

@Configuration
@BootstrapConfiguration
public class SslConfiguration {
  @Value("${http.client.ssl.trust-store}")
  private URL trustStore;
  @Value("${http.client.ssl.trust-store-password}")
  private String trustStorePassword;

  @Bean
  public DiscoveryClient.DiscoveryClientOptionalArgs getTrustStoredEurekaClient(SSLContext sslContext) {
    DiscoveryClient.DiscoveryClientOptionalArgs args = new DiscoveryClient.DiscoveryClientOptionalArgs();
    args.setSSLContext(sslContext);
    return args;
  }

  @Bean
  public SSLContext sslContext() throws Exception {
    return new SSLContextBuilder().loadTrustMaterial(trustStore, trustStorePassword.toCharArray()).build();
  }
}

因为DiscoveryClientOptionalArgs现在定义了两次,所以添加另一个类,在Spring上下文启动后加载

@Configuration
public class DiscoveryServiceConfiguration {
  @Bean
  public static BeanFactoryPostProcessor registerPostProcessor() {
    return (ConfigurableListableBeanFactory beanFactory) -> {
      BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
      for (String beanDefinitionName : registry.getBeanDefinitionNames()) {
        if (beanDefinitionName.equalsIgnoreCase("discoveryClientOptionalArgs")) {
          BeanDefinition beanDefinition = registry.containsBeanDefinition(beanDefinitionName) ? registry.getBeanDefinition(beanDefinitionName) : null;
          if (beanDefinition != null) {
            if (registry.containsBeanDefinition(beanDefinitionName)) {
              registry.removeBeanDefinition(beanDefinitionName);
            }
          }
        }
      }
    };
  }
}
 类似资料:
  • 在SpringBoot中读取环境变量的最佳方法是什么? 在Java中,我使用了以下方法: 是否可以使用注释来实现?

  • 还有人看到这个吗?使用Python2.7。13在窗户上。我是SSL截获的幕后黑手,通过安装Certfi并将我们自己的证书添加到cacert,我花了很长时间才克服python和pip上的SSL错误。佩姆。 但这在virtualenv中不起作用,无论我尝试了什么(相同的步骤),我仍然会得到错误- " 想知道是否有人看到了这一点,并得到它的工作-谢谢!

  • 本文向大家介绍SpringBoot + SpringSecurity 环境搭建的步骤,包括了SpringBoot + SpringSecurity 环境搭建的步骤的使用技巧和注意事项,需要的朋友参考一下 一、使用SpringBoot+Maven搭建一个多模块项目(可以参考这篇文章 --> 这里) 二、删除父工程的src文件,删除app、browser、core下的.java文件 依赖关系: dem

  • 本文向大家介绍springboot 多环境配置教程,包括了springboot 多环境配置教程的使用技巧和注意事项,需要的朋友参考一下 在上一课中我们通过idea工具没有做任何配置就构建了一个springboot项目,并且已经成功启动了,但我们都很清楚这些都远远不能达到我们实际项目的需求,比如我们要引入我们自己的redis配置、mysql配置等,应该如何处理呢?在spring mvc中我们都是通过

  • 我正在尝试运行一个使用Docker-Compose运行的SpringBoot项目。我使用启动了它的依赖项(Redis、MongoDB和RabbitMQ 我正在构建项目并使用以下命令运行它 我总是犯这些错误: 上处理条件时出错 中的占位符“OAUTH_CLIENTID” 在docker-compose文件中,环境变量的值在environment部分中定义。 这就是application.yml的样子

  • 我正在使用一个具有不同测试环境(test、QA、UAT、PROD)Spring boot应用程序的关键云代工,我创建了多个属性文件(每个指向不同的数据库),如 或者,当我转移到更高的环境时,我需要改变吗? 提前道谢。