为运行时创建的标识提供程序添加密钥

cwtwac6a  于 2021-07-16  发布在  Java
关注(0)|答案(1)|浏览(360)

目前,我正在使用springsecurity编辑项目中saml支持的现有实现。我有多个identityprovider,我将其数据存储在数据库中。使用我的应用程序ui,我可以在运行时添加新的identityproviders,它将被添加到cachingmetadatamanager中。之后,调用refreshmetadata。不过,我有jkskeymanager,它在应用程序启动时加载,并加载一个用于所有identityproviders的所有元数据的jks密钥库。我希望用户能够在运行时创建identityprovider时使用我的应用程序ui上传(或粘贴)私钥,这样,不同的密钥可以用于不同的identityprovider,但我不知道如何使用。如果我把密钥存储在jks文件或其他地方,对我来说没有区别。没有spring引导,恐怕无法升级库版本/迁移到其他库。
密钥管理器注入如下所示:

@Bean
  public KeyManager keyManager() {
    DefaultResourceLoader loader = new DefaultResourceLoader();
    Resource storeFile = loader
        .getResource(environment.getProperty("server.ssl.key-store"));
    Map<String, String> passwords = new HashMap<>();
    passwords.put(environment.getProperty("server.ssl.key-alias"), environment.getProperty("server.ssl.key-store-password"));
    String defaultKey = "spring";
    return new JKSKeyManager(storeFile, environment.getProperty("server.ssl.key-store-password"), passwords, defaultKey);
  }

使用的saml扩展是org.springframework.security.extensions中的spring-security-saml2-core(1.0.3.release)。而springsecurity版本是3.2.9.release。

2eafrhcq

2eafrhcq1#

JKSKeyManager 在构造时计算所有可用的键,这是 KeyManager 可能是最好的。
例如,如下所示:

public DynamicJKSKeyManager extends JKSKeyManager {
    private final KeyStore keyStore;

    public KeyStoreKeyManager(KeyStore keyStore, Map<String, String> passwords, String defaultKey) {
        super(keyStore, passwords, defaultKey);
        this.keyStore = keyStore;
    }

    @Override
    public Set<String> getAvailableCredentials() {
        try {
            Set<String> availableKeys = new HashSet<String>();
            Enumeration<String> aliases = keyStore.aliases();
            while (aliases.hasMoreElements()) {
                availableKeys.add(aliases.nextElement());
            }
            return availableKeys;
        } catch (KeyStoreException e) {
            throw new RuntimeException("Unable to load aliases from keyStore", e);
        }
    }
}

会改变世界 getAvailableCredentials 方法读取 KeyStore 每次调用的别名。
然后,当您需要向 KeyStore ,您可以使用 KeyStore api来做。
当然,正如你提到的,你不必使用 KeyStore . 无论您在哪里存储密钥,都可以实现自己的密钥 KeyManager 使用opensaml的 CollectionCredentialResolver 而不是 KeyStoreCredentialResolver .

相关问题