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

Spring Secuirty SAML2 Core-为运行时创建的身份提供程序添加密钥

曹恩
2023-03-14

目前,我正在使用Spring Security编辑我的项目上SAML支持的现有实现。我有多个标识提供商,为此我将数据存储在数据库中。使用我的应用程序用户界面,我可以在运行时添加新的标识提供商,它将被添加到CachingMetadataManager中。之后,调用刷新元数据。然而,我有JKSKeyManager,它在应用程序启动时加载,并加载一个JKS密钥库,用于所有标识提供商的所有元数据。我希望用户能够在运行时创建标识提供商期间使用我的应用程序用户界面上传(或粘贴)私钥,这样,不同的密钥可以用于不同的标识提供商,但我不知道如何使用。如果我把密钥存储在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的spring-security-saml2-core(1.0.3.RELEASE)。springframework。安全扩展。Spring Security vesion是3.2.9。释放

共有1个答案

夏侯涵映
2023-03-14

由于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);
        }
    }
}

将更改方法以读取每个调用上的KeyStore别名。

然后,当需要向KeyStore添加密钥时,可以使用KeyStoreAPI来完成。

当然,正如您所提到的,您不必使用密钥库。无论在哪里存储密钥,都可以实现自己的KeyManager,并使用OpenSAML的CollectionCredentialResolver而不是KeyRecredentialResolver

 类似资料:
  • 我已经创建了身份提供程序,并且从浏览器中它工作正常。 参考:密钥斗篷身份提供程序后代理登录抛出错误 从浏览器,我可以使用外部IDP登录,如果外部IDP用户不在keycloak中,它会在keyclock中创建,这绝对没问题,并重定向到仪表板。 但我的问题是,我们如何用keycloak rest api实现这个流程? 是否有任何api用于使用外部IDP登录,并将获得外部IDP的令牌以及密钥斗篷的令牌?

  • 我向我的领域添加了一个自定义OIDC身份提供者,我想使用直接访问授权流(或< code>grant_type=password),但这不起作用。 钥匙斗篷有可能吗? 当尝试使用授权代码流程时,一切正常,但使用时出错 被退回。 我正在尝试获取访问令牌 e 刷新令牌执行以下请求: 这是身份提供者配置:这是身份提供者配置

  • 我有问题与KeyCloak的配置和单一注销从SAML身份提供程序。 脚本: 用户尝试使用KeyCloak的客户端(OID)登录Service Provider KC重定向到SAML身份提供程序 输入正确的凭据,用户登录,KC创建会话并将用户重定向回SP页面 在另一个选项卡中,用户直接登录IP(由于SSO,不需要凭据) 用户从SP注销 刷新第二个选项卡(IP)后,用户注销。 但是,如果用户先从IP注

  • 有没有办法在运行时从数据库添加新的 IdP,同时使用适用于 SAML 2.0 的 Spring 安全扩展 如何在运行时从用户处获取所需的属性,而无需重新启动服务器或应用程序,从而将新的身份提供者添加到Java Web应用程序中。 以及需要将哪些所有通用属性(如entityId、SSO身份验证URL和公共X.509证书)作为输入,以便在不重新启动服务器的情况下将新IdP添加到现有Web应用程序中。

  • 我一直在尝试使用SDK从已安装的链码中调用函数,但我遇到了一个问题,我正在努力解决这个问题。我构建的javascript程序是测试/集成/客户端的混合。js文件和fabcar/invoke。js。但是,当我运行脚本时,在运行事务建议时,我会遇到以下错误: 错误:[client-utils.js]: sendPeersProposal-Promise被拒绝:错误:未能反序列化创建者身份,错误提供的身

  • 问题内容: 我想知道是否有一种方法让Dagger知道在有新数据可用时它应该重新创建对象。 我正在说的实例是我具有改造的请求标头。在某个时候(当用户登录时),我得到一个令牌,我需要将其添加到改造的标头中以发出经过身份验证的请求。问题是,我留下了相同的未经认证的改造版本。这是我的注入代码: 关于如何进行这项工作的任何想法? 问题答案: 请考虑使用 @oldergod* 提到的方法,因为它是 “官方的”