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

使用Spring云保管库连接到保管库时发生“秘密标识丢失”错误

董俊晖
2023-03-14

我试图连接到Spring保管库使用基于角色的身份验证(Spring引导项目)。

根据留档,我应该能够连接到Spring保险库只使用约(拉动模式)。但是,我在应用程序启动时得到secrect-id缺失异常

http://cloud.spring.io/spring-cloud-vault/single/spring-cloud-vault.html#_approle_authentication

当我通过secret id时,我也能够连接,并且属性/值得到正确的自动连接。

是否有任何方法可以使用“令牌角色/角色id”和spring在运行时使用上述信息自动为我生成机密id来连接vault。

spring.cloud.vault:
    scheme: http
    host: <host url>
    port: 80
    token : <token>
    generic.application-name: vault/abc/pqr/test
    generic.backend: <some value>
    generic.default-context: vault/abc/pqr/test
    token: <security token>
    authentication: approle
    app-role:
      role-id: <role-id>

POM:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-starter-config</artifactId>
        <version>1.0.0.BUILD-SNAPSHOT</version>
    </dependency>

如果需要其他信息,请告诉我。

@mp911de,我按照您的建议进行了尝试,但是SpringCloudVault正在选择引导中设置的属性。yml和“onApplicationEvent”中没有一个集合,因此解决方案不起作用。我尝试通过“System.setProperty”方法设置属性,但该事件不起作用。

但是,如果我在运行前的main方法中设置属性,它会按预期工作。但是我需要先加载application.properties(需要从那里选择一些配置),因此不想在那里编写逻辑。

我的做法有什么不对吗??

@Component public class LoadVaultProperties implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
private RestTemplate restTemplate = new RestTemplate();

@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    try {
        String roleId = getRoleIdForRole(event); //helper method
        String secretId = getSecretIdForRoleId(event); //helper method

        Properties properties = new Properties();

        properties.put("spring.cloud.vault.app-role.secret-id", secretId);
        properties.put("spring.cloud.vault.app-role.role-id", roleId); 

        event.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource(
                PropertySourceBootstrapConfiguration.BOOTSTRAP_PROPERTY_SOURCE_NAME, properties));          
    } catch (Exception ex) {
        throw new IllegalStateException(ex);
    }
}

共有1个答案

连坚白
2023-03-14

Spring Vault的AppRole身份验证支持两种模式,但不支持拉模式:

  1. 推送模式,其中您需要提供secret_id
  2. 通过传递role_id而无需secret_id进行身份验证。此模式需要创建角色,而不需要在创建角色时设置bind_secret_id=falsesecret_id

Vault文档中提到的拉动模式要求客户端了解从包装响应中获得的机密id。SpringVault无法获取经过包装的机密id,但我认为这是一个不错的增强。

更新:在应用程序启动之前设置系统属性:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {

        System.setProperty("spring.cloud.vault.app-role.role-id", "…");
        System.setProperty("spring.cloud.vault.app-role.secret-id", "…");

        SpringApplication.run(MyApplication.class, args);
}

参考资料:

  • 有关许可创建的Vault文档
 类似资料:
  • 目前,我正在连接到一个公司vault服务,在这里我使用一个vault令牌,并通过我的spring cloud config服务中的下面标题传递它,所有微服务的属性都保存在该标题下。 哪里http://localhost:8080是我的spring云配置服务,s.myvaulttoken是我的vault令牌。这是工作绝对好。 我想知道这个令牌的有效性。我所阅读的留档令牌可以是两种类型:服务或批处理。

  • 守则 @RestController的代码:

  • 我按照在Spring Boot上使用GCP设置秘密管理器的说明,在Google Cloud中创建了一个秘密,并在application.properties中添加了以下内容 但是,它不起作用,如果我使用,我可以通过

  • 基本上我们可以有一个只能读取一次的金库密钥吗?

  • 我想使用vault服务器来存储机密并将其部署在openshift上。 我编写了这个 dockerfile,构建了映像并将其推送到 openshift 注册表,并从此映像流创建了一个部署: 以下是配置: 我创建了一条到8200端口的路径。当我从vault-server pod内部使用vault CLI时,它工作正常,我可以登录、配置等。当我在本地计算机上使用openshift cli将端口8200转

  • 我正在尝试使用JDBC连接到托管在云中的MongoDB。但是,认证失败。 以下是我的Java代码: 当我执行时,我得到以下异常: 我能够通过mLab web界面以相同的用户id和密码成功登录,并且工作正常。 但是,只有JDBC尝试失败。 有人能帮忙吗,这里有什么问题?