配置Spring Cloud Config Server和Spring Cloud Vault进行生产

Cod*_*per 6 java spring spring-cloud spring-cloud-config

我正在尝试设置由Spring Cloud Vault秘密管理支持的Spring Cloud Config Server.我对Spring比较新,但我在这里尝试了以下说明和示例: -

http://cloud.spring.io/spring-cloud-vault-config/

如果您按照默认设置(如http,localhost和8200用于保险库端点)和tls_disable = 1来关闭SSL,则一切正常.然而,对于任何真实环境而言,这些都不是实用的设置,并且几乎没有任何示例可以帮助解决这 有人可以帮助一个有效的例子吗?

我已成功设置了启用TLS的保险库.我已成功设置一个使用自签名证书连接的配置服务器.我甚至可以将一个秘密值注入配置服务器并通过@Value和公开它@PostConstruct.

所有这些都有效.但是,当我尝试利用Spring Conig端点访问Vault时,我得到以下内容: -

{
  "timestamp": 1486413850574,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "org.springframework.web.client.ResourceAccessException",
  "message": "I/O error on GET request for \"http://127.0.0.1:8200/v1/secret/myapp\": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect",
  "path": "/myapp/default"
}
Run Code Online (Sandbox Code Playgroud)

即使我在bootstrap.yml.中设置了覆盖,配置服务器也使用默认值.

server:
    port: 8888

spring:
    profiles:
        active: vault

spring.cloud.vault:
    host: myhost.mydomain.com
    port: 8200
    scheme: https
    authentication: TOKEN
    token: 0f1887c3-d8a8-befd-a5a2-01e4e066c50
    ssl:
        trust-store: configTrustStore.jks
        trust-store-password: changeit
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它应该指向myhost.mydomain.com而不是127.0.0.1,它应该使用https,而不是http作为协议方案.

我不确定为什么它将这些默认值用于配置服务器端点,但在spring cloud Vault启动期间使用了正确的设置.我正在使用Spring Dalsten.M1和Spring Cloud Vault 1.0.0.M1的所有最新稳定版本.我意识到这些是里程碑版本.我也尝试过Camden和Brixton组合,但没有运气.如果需要,我可以提供代码.

任何帮助非常感谢.

Cod*_*per 2

正如我在对 spensergibb 的回复中提到的,我自己在解决这个问题方面取得了一些成功。根据他的评论,我将澄清我的意图,因为这将有助于对问题达成共识。我正在尝试做两件事:-

  1. 建立一个使用 Vault 作为后端的配置服务器(而不是默认的 GIT 后端),并将 Vault API 公开给客户端应用程序(通过 TLS),以便它们可以检索自己的机密。我不希望所有客户端应用程序都直接连接到 Vault。我希望他们通过将配置服务器连接到 Vault 来从配置服务器获取配置。直到昨晚我都无法实现这个目标,除非我将所有内容设置为默认值,禁用 TLS 并使用环回地址、Vault 软件的端口 8200 等。显然,默认值对于我们的任何部署环境都不实用。我要提到的是,斯宾塞吉布发布的链接确实帮助我理解了为什么这不起作用,但其微妙之处就是我之前错过它的原因。请继续阅读我的解释。

  2. 我希望配置服务器直接从 Vault 进行配置。即通过 Spring Cloud Vault Config 连接到 Vault。正如文档中所述,这对我来说立即有效。然而这个目标有点微不足道,因为我目前没有真正的用例。但我想了解是否可以这样做,因为我没有看到不这样做的真正原因,而且这似乎是集成 Vault 的良好第一步。

这两种功能之间的区别帮助我理解了问题源于以下事实:Spring Cloud Config Server 和 Spring Cloud Vault 似乎使用两种不同的 bean 来注入 Vault 配置属性。Spring Cloud Config Server 使用带有 @ConfigurationProperties("spring.cloud.config.server.vault") 注解的 VaultEnvironmentRepository,Spring Cloud Vault 使用带有 @ConfigurationProperties("spring.cloud.vault") 注解的 VaultProperties。

这导致我向我的 bootstrap yml 添加两个不同的配置。

server:
    port: 8888

spring:
    profiles:
        active: local, vault

    application:
        name: quoting-domain-configuration-server

    cloud:
        vault:
            host: VDDP03P-49A26EF.lm.lmig.com
            port: 8200
            scheme: https
            authentication: TOKEN
            token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
            ssl:
                trust-store: configTrustStore.jks
                trust-store-password: changeit

        config:
            server:
                vault:
                    host: VDDP03P-49A26EF.lm.lmig.com
                    port: 8200
                    scheme: https
                    authentication: TOKEN
                    token: 0f1997c3-d8a8-befd-a5a2-01e4e066c50a
Run Code Online (Sandbox Code Playgroud)

请注意相同的配置详细信息。只是 yml 路径不同。这是我错过的一个微妙点,因为我首先让目标 1 工作,并假设相同的配置适用于两个目标。(注:令牌和密码是人为设计的)。

除了 SSL 握手错误之外,这几乎有效。如您所见,spring.cloud.config.server.vault 路径上没有设置 SSL 属性。VaultProperties bean 不支持它们。我不知道如何处理这个问题(也许是我找不到的另一个非Vault特定的bean)。我的解决方案是简单地自己强制进行证书配置,如下所示:-

@SpringBootApplication
@EnableConfigServer
public class Application
{
    public static void main(String[] args)
    {
        System.setProperty("javax.net.ssl.trustStore",
            Application.class.getResource("/configTrustStore.jks").getFile());
        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
        SpringApplication.run(Application.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个 SSL 解决方案非常丑陋。我确信一定有更好的方法来完成这部分。所以我愿意接受其他建议。然而,一旦我完成了上述所有步骤,一切就都正常了。