es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar el almacén de claves JKS en el contexto de Spring Security SAML2.

Estoy en medio de transferir una antigua implementación de SAML que fue escrita utilizando la Extensión de Seguridad de SAML de Spring a la Seguridad de SAML2 de Spring. Tengo dificultades con el siguiente bean:

<!-- Almacenamiento centralizado de claves criptográficas -->
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
    <constructor-arg value="classpath:security/ssoKeystore_test.jks"></constructor-arg>
    <constructor-arg type="java.lang.String" value="client123"></constructor-arg>
    <constructor-arg>
        <map>
            <entry key="ssokey" value="client123"></entry>
        </map>
    </constructor-arg>
    <constructor-arg type="java.lang.String" value="ssokey"></constructor-arg>
</bean>

¿Existe alguna forma equivalente en el contexto de Seguridad de Spring para configurar el administrador de claves?
Quiero trabajar exclusivamente con la configuración de Java.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma equivalente en el contexto de Spring Security para configurar el administrador de claves utilizando la configuración de Java. Puede crear una clase que implemente la interfaz org.springframework.security.saml.key.KeyManager y utilizar la clase org.springframework.security.saml.util.SAMLUtil para cargar el archivo de almacén de claves. Aquí tienes un ejemplo de configuración de Java para el administrador de claves:

    import org.opensaml.xml.security.credential.Credential;
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.saml.key.KeyManager;
    import org.springframework.security.saml.key.KeyManagerImpl;
    import org.springframework.security.saml.key.SimpleKey;
    import org.springframework.security.saml.util.SAMLUtil;
    
    import java.security.KeyStore;
    import java.security.cert.X509Certificate;
    import java.util.Collections;
    
    public class SamlConfig {
    
        // Configuración del almacén de claves
        private static final String KEYSTORE_FILE = "classpath:security/ssoKeystore_test.jks";
        private static final String KEYSTORE_PASSWORD = "client123";
        private static final String KEY_ALIAS = "ssokey";
        private static final String KEY_PASSWORD = "client123";
    
        @Bean
        public KeyManager keyManager() throws Exception {
            KeyStore keyStore = SAMLUtil.getKeyStore(KEYSTORE_FILE, KEYSTORE_PASSWORD);
            X509Certificate certificate = (X509Certificate) keyStore.getCertificate(KEY_ALIAS);
            SimpleKey signingKey = new SimpleKey();
            signingKey.setPublicKey(certificate.getPublicKey());
            signingKey.setPrivateKey((java.security.PrivateKey) keyStore.getKey(KEY_ALIAS, KEY_PASSWORD.toCharArray()));
            Credential credential = new org.opensaml.xml.security.credential.BasicCredential(certificate.getPublicKey(), signingKey.getPrivateKey());
            KeyManagerImpl keyManager = new KeyManagerImpl(Collections.singletonList(signingKey), Collections.singletonMap(KEY_ALIAS, credential));
            return keyManager;
        }
    
        // Otros beans de configuración...
    
    }
    

    En este ejemplo, utilizamos el método SAMLUtil.getKeyStore para cargar el archivo de almacén de claves desde el classpath, y luego obtenemos el certificado y la clave privada para KEY_ALIAS. Creamos un objeto SimpleKey y establecemos las claves pública y privada, y luego creamos un objeto BasicCredential con las mismas claves. Finalmente, creamos un objeto KeyManagerImpl con una lista de objetos SimpleKey (en este caso solo uno) y un mapa de alias de claves a credenciales (en este caso solo una entrada con KEY_ALIAS y credential).

Comments are closed.